From b5e7cfa16ac14bc0e0ab5f74f2bd8108b011d04b Mon Sep 17 00:00:00 2001 From: Gary Russell Date: Mon, 11 May 2015 15:02:47 +0100 Subject: [PATCH] INT-3692: Add Annotation-Based TCP Demo --- basic/tcp-client-server/README.md | 6 + .../TcpClientServerAnnotationDemoTest.java | 151 ++++++++++++++++++ 2 files changed, 157 insertions(+) create mode 100644 basic/tcp-client-server/src/test/java/org/springframework/integration/samples/tcpclientserver/TcpClientServerAnnotationDemoTest.java diff --git a/basic/tcp-client-server/README.md b/basic/tcp-client-server/README.md index c6cf6719..d76e71e3 100644 --- a/basic/tcp-client-server/README.md +++ b/basic/tcp-client-server/README.md @@ -14,6 +14,7 @@ Several variations of the sample are provided: * Serializer Demo * Using the Stx-Etx [Serializer][]/[Deserializer][] * Using a Custom [Serializer][]/[Deserializer][] +* Annotation based client-server Demo (JUnit test only) ### Client-Server Demo @@ -135,6 +136,11 @@ Some use cases may dictate you needing to create your own stream handling serial You can run the example by executing JUnit test **TcpServerCustomSerializerTest**. +#### Annotation-based Configuration + +A simple client server test using entirely annotation-based configuration is shown in **TcpClientServerAnnotationDemoTest**. + + [ByteArrayCrLfSerializer]: http://static.springsource.org/spring-integration/api/org/springframework/integration/ip/tcp/serializer/ByteArrayCrLfSerializer.html [ByteArrayStxEtxSerializer]: http://static.springsource.org/spring-integration/api/org/springframework/integration/ip/tcp/serializer/ByteArrayStxEtxSerializer.html [control character]: http://en.wikipedia.org/wiki/Control_character diff --git a/basic/tcp-client-server/src/test/java/org/springframework/integration/samples/tcpclientserver/TcpClientServerAnnotationDemoTest.java b/basic/tcp-client-server/src/test/java/org/springframework/integration/samples/tcpclientserver/TcpClientServerAnnotationDemoTest.java new file mode 100644 index 00000000..b878cf17 --- /dev/null +++ b/basic/tcp-client-server/src/test/java/org/springframework/integration/samples/tcpclientserver/TcpClientServerAnnotationDemoTest.java @@ -0,0 +1,151 @@ +/* + * Copyright 2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.integration.samples.tcpclientserver; + +import static org.junit.Assert.assertEquals; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.integration.annotation.IntegrationComponentScan; +import org.springframework.integration.annotation.MessageEndpoint; +import org.springframework.integration.annotation.MessagingGateway; +import org.springframework.integration.annotation.ServiceActivator; +import org.springframework.integration.annotation.Transformer; +import org.springframework.integration.channel.DirectChannel; +import org.springframework.integration.config.EnableIntegration; +import org.springframework.integration.ip.tcp.TcpInboundGateway; +import org.springframework.integration.ip.tcp.TcpOutboundGateway; +import org.springframework.integration.ip.tcp.connection.AbstractClientConnectionFactory; +import org.springframework.integration.ip.tcp.connection.AbstractServerConnectionFactory; +import org.springframework.integration.ip.tcp.connection.TcpNetClientConnectionFactory; +import org.springframework.integration.ip.tcp.connection.TcpNetServerConnectionFactory; +import org.springframework.integration.ip.util.TestingUtilities; +import org.springframework.integration.test.util.SocketUtils; +import org.springframework.messaging.MessageChannel; +import org.springframework.messaging.MessageHandler; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + + +/** + * Demonstrates the use of a gateway as an entry point into the integration flow. + * The message generated by the gateway is sent over tcp by the outbound gateway + * to the inbound gateway. In turn the inbound gateway sends the message to an + * echo service and the echoed response comes back over tcp and is returned to + * the test case for verification. + * + * The test uses explicit transformers to convert the byte array payloads to + * Strings. + * + * @author Gary Russell + * @author Gunnar Hillert + * + */ +@ContextConfiguration(classes = TcpClientServerAnnotationDemoTest.Config.class) +@RunWith(SpringJUnit4ClassRunner.class) +public class TcpClientServerAnnotationDemoTest { + + @Autowired + Config.Gateway gw; + + @Autowired + AbstractServerConnectionFactory crLfServer; + + @Before + public void setup() { + TestingUtilities.waitListening(this.crLfServer, 10000L); + } + + @Test + public void testHappyDay() { + String result = gw.viaTcp("Hello world!"); + assertEquals("HELLO WORLD!", result); + } + + @EnableIntegration + @IntegrationComponentScan + @Configuration + public static class Config { + + private final int port = SocketUtils.findAvailableServerSocket(); + + @MessagingGateway(defaultRequestChannel="toTcp") + public interface Gateway { + + String viaTcp(String in); + + } + + @Bean + @ServiceActivator(inputChannel="toTcp") + public MessageHandler tcpOutGate(AbstractClientConnectionFactory connectionFactory) { + TcpOutboundGateway gate = new TcpOutboundGateway(); + gate.setConnectionFactory(connectionFactory); + gate.setOutputChannelName("resultToString"); + return gate; + } + + @Bean + public TcpInboundGateway tcpInGate(AbstractServerConnectionFactory connectionFactory) { + TcpInboundGateway inGate = new TcpInboundGateway(); + inGate.setConnectionFactory(connectionFactory); + inGate.setRequestChannel(fromTcp()); + return inGate; + } + + @Bean + public MessageChannel fromTcp() { + return new DirectChannel(); + } + + @MessageEndpoint + public static class Echo { + + @Transformer(inputChannel="fromTcp", outputChannel="toEcho") + public String convert(byte[] bytes) { + return new String(bytes); + } + + @ServiceActivator(inputChannel="toEcho") + public String upCase(String in) { + return in.toUpperCase(); + } + + @Transformer(inputChannel="resultToString") + public String convertResult(byte[] bytes) { + return new String(bytes); + } + + } + + @Bean + public AbstractClientConnectionFactory clientCF() { + return new TcpNetClientConnectionFactory("localhost", this.port); + } + + @Bean + public AbstractServerConnectionFactory serverCF() { + return new TcpNetServerConnectionFactory(this.port); + } + + } + +}