From 933dc91bd296d2c9ecb0d30fc2a1af6e06b9566a Mon Sep 17 00:00:00 2001 From: Gary Russell Date: Mon, 19 Nov 2018 18:42:41 -0500 Subject: [PATCH] tcp-broadcast: Polishing Wait for server to start listening before attempting to connect. --- basic/tcp-broadcast/README.adoc | 5 ++++- .../tcpbroadcast/TcpBroadcastApplication.java | 20 ++++++++++++++++--- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/basic/tcp-broadcast/README.adoc b/basic/tcp-broadcast/README.adoc index 77d52557..1f5fec3a 100644 --- a/basic/tcp-broadcast/README.adoc +++ b/basic/tcp-broadcast/README.adoc @@ -1,4 +1,4 @@ -== TCP Sample +== TCP Broadcast Sample This sample demonstrates broadcasting a message received by a web controller to all connected TCP clients. @@ -22,3 +22,6 @@ The TCP server listens on port 1234. `foo from client# 1` `foo from client# 3` +To shut down the application: + +`curl http://localhost:8080/shutdown` diff --git a/basic/tcp-broadcast/src/main/java/org/springframework/integration/samples/tcpbroadcast/TcpBroadcastApplication.java b/basic/tcp-broadcast/src/main/java/org/springframework/integration/samples/tcpbroadcast/TcpBroadcastApplication.java index 57326973..c369cb5f 100644 --- a/basic/tcp-broadcast/src/main/java/org/springframework/integration/samples/tcpbroadcast/TcpBroadcastApplication.java +++ b/basic/tcp-broadcast/src/main/java/org/springframework/integration/samples/tcpbroadcast/TcpBroadcastApplication.java @@ -19,6 +19,8 @@ package org.springframework.integration.samples.tcpbroadcast; import java.io.IOException; import java.io.InputStream; import java.net.Socket; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; import java.util.stream.IntStream; import javax.net.SocketFactory; @@ -31,19 +33,21 @@ import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.DependsOn; +import org.springframework.context.event.EventListener; import org.springframework.core.task.TaskExecutor; import org.springframework.integration.dsl.IntegrationFlow; import org.springframework.integration.dsl.IntegrationFlows; import org.springframework.integration.ip.IpHeaders; import org.springframework.integration.ip.dsl.Tcp; import org.springframework.integration.ip.tcp.connection.AbstractServerConnectionFactory; +import org.springframework.integration.ip.tcp.connection.TcpConnectionServerListeningEvent; import org.springframework.integration.ip.tcp.serializer.ByteArrayCrLfSerializer; import org.springframework.messaging.handler.annotation.Header; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @SpringBootApplication @@ -54,6 +58,8 @@ public class TcpBroadcastApplication { @Configuration public static class Config { + private final CountDownLatch listenLatch = new CountDownLatch(1); + /* * Server connection factory. */ @@ -102,15 +108,23 @@ public class TcpBroadcastApplication { } /* - * Start 5 clients. + * Wait for server to start listenng and start 5 clients. */ @Bean public ApplicationRunner runner(TaskExecutor exec, Broadcaster caster) { return args -> { + if (!this.listenLatch.await(10, TimeUnit.SECONDS)) { + throw new IllegalStateException("Failed to start listening"); + } IntStream.range(1, 6).forEach(i -> exec.execute(new Client())); }; } + @EventListener + public void serverStarted(TcpConnectionServerListeningEvent event) { + this.listenLatch.countDown(); + } + } /* @@ -137,7 +151,7 @@ public class TcpBroadcastApplication { return "sent: " + what; } - @GetMapping("/shutdown") + @RequestMapping("/shutdown") public void shutDown() { this.applicationContext.close(); }