My tcp client using spring integration not able to get response

徘徊边缘 提交于 2020-01-06 05:09:07

问题


I have created tcp client using spring integration I am able to receive response for my send message . But when I uses localDateTime.now() to log time I am not able to receive the response of send message . I know this can be solved using time setting to make thread wait. As I am new to spring integration So kindly help me how to do it.

@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Test
{

    protected final Log logger = LogFactory.getLog(this.getClass());

    // **************** Client **********************************************
    @Bean
    public MessageChannel replyChannel()
    {
        return new DirectChannel();
    }

    @Bean
    public MessageChannel sendChannel()
    {
        MessageChannel directChannel = new DirectChannel();
        return directChannel;
    }

    @EnableIntegration
    @IntegrationComponentScan
    @Configuration
    public static class config
    {
        @MessagingGateway(defaultRequestChannel = "sendChannel", defaultReplyChannel = "replyChannel")
        public interface Gateway
        {

            String Send(String in);

        }
    }

    @Bean
    AbstractClientConnectionFactory tcpNetClientConnectionFactory()
    {
        AbstractClientConnectionFactory tcpNetClientConnectionFactory = new TcpNetClientConnectionFactory("localhost",
                9999);
        tcpNetClientConnectionFactory.setSerializer(new UCCXImprovedSerializer());
        tcpNetClientConnectionFactory.setDeserializer(new UCCXImprovedSerializer());
        tcpNetClientConnectionFactory.setSingleUse(true);

        tcpNetClientConnectionFactory.setMapper(new TcpMessageMapper());
        return tcpNetClientConnectionFactory;
    }

    @Bean
    @ServiceActivator(inputChannel = "sendChannel")
    TcpOutboundGateway tcpOutboundGateway()
    {
        TcpOutboundGateway tcpOutboundGateway = new TcpOutboundGateway();
        tcpOutboundGateway.setConnectionFactory(tcpNetClientConnectionFactory());
        tcpOutboundGateway.setReplyChannel(replyChannel());
        return tcpOutboundGateway;
    }

    public static void main(String args[])
    {
        // new LegaServer();
        ConfigurableApplicationContext applicationContext = SpringApplication.run(Test.class, args);
        String temp = applicationContext.getBean(Gateway.class).Send("kksingh");
        System.out.println(LocalDateTime.now()+"output" + temp);

        applicationContext.stop();

    }
}

My custom serialzer and deserialser UCCXImprovedSerializerclass after updating as per @Garry

 public class UCCXImprovedSerializer implements Serializer<String>, Deserializer<String>
{
     @Override
    public String deserialize(InputStream initialStream) throws IOException
    {

        System.out.println("deserialzier called");
        StringBuilder sb = new StringBuilder();
        try (BufferedReader rdr = new BufferedReader(new InputStreamReader(initialStream)))
        {
            for (int c; (c = rdr.read()) != -1;)
            {
                sb.append((char) c);

            }
        }
        return sb.toString();
    }

    @Override
    public void serialize(String msg, OutputStream os) throws IOException
    {
        System.out.println(msg + "---serialize---" + Thread.currentThread().getName() + "");
        os.write(msg.getBytes());
    }
   }

My server at port 9999 code

   try
        {
            clientSocket = echoServer.accept();
            System.out.println("client connection established..");
            is = new DataInputStream(clientSocket.getInputStream());
            os = new PrintStream(clientSocket.getOutputStream());
            String tempString = "kksingh";
            byte[] tempStringByte = tempString.getBytes();
            byte[] temp = new byte[tempString.getBytes().length];
            while (true)
            {
                is.read(temp);
                System.out.println(new String(temp) + "--received msg is--- " + LocalDateTime.now());
                System.out.println(LocalDateTime.now() + "sending value");
                os.write(tempStringByte);
                break;
            }
        } catch (IOException e)
        {
            System.out.println(e);
        }
    }

My log file for tcp client

2017-06-04 23:10:14.771  INFO 15568 --- [           main] o.s.i.endpoint.EventDrivenConsumer       : started org.springframework.integration.endpoint.EventDrivenConsumer@1f12e153
kksingh---serialize---main
pool-1-thread-1---deserialize----
pool-1-thread-1---deserialize----
pool-1-thread-1---deserialize----
pool-1-thread-1---deserialize----
2017-06-04 23:10:14.812 ERROR 15568 --- [pool-1-thread-1] o.s.i.ip.tcp.TcpOutboundGateway          : Cannot correlate response - no pending reply for localhost:9999:57622:bc98ee29-8957-47bd-bd8a-f734c3ec3f9d
2017-06-04T23:10:14.809output
2017-06-04 23:10:14.821  INFO 15568 --- [           main] o.s.c.support.DefaultLifecycleProcessor  : Stopping beans in phase 0

My log file for server side

client connection established..
kksingh--received msg is--- 2017-06-04T23:10:14.899
2017-06-04T23:10:14.899sending value

when I removed the localdatetime.now() from server and tcpclient I am able to get response as outputkksingh

o.s.i.endpoint.EventDrivenConsumer       : Adding {logging-channel-adapter:_org.springframework.integration.errorLogger} as a subscriber to the 'errorChannel' channel
2017-06-05 12:46:32.494  INFO 29076 --- [           main] o.s.i.channel.PublishSubscribeChannel    : Channel 'application.errorChannel' has 1 subscriber(s).
2017-06-05 12:46:32.495  INFO 29076 --- [           main] o.s.i.endpoint.EventDrivenConsumer       : started _org.springframework.integration.errorLogger
2017-06-05 12:46:32.746  INFO 29076 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)
2017-06-05 12:46:32.753  INFO 29076 --- [           main] o.s.i.samples.tcpclientserver.Test       : Started Test in 2.422 seconds (JVM running for 2.716)
2017-06-05 12:46:32.761  INFO 29076 --- [           main] o.s.i.endpoint.EventDrivenConsumer       : Adding {bridge:null} as a subscriber to the 'replyChannel' channel
2017-06-05 12:46:32.762  INFO 29076 --- [           main] o.s.integration.channel.DirectChannel    : Channel 'application.replyChannel' has 1 subscriber(s).
2017-06-05 12:46:32.763  INFO 29076 --- [           main] o.s.i.endpoint.EventDrivenConsumer       : started org.springframework.integration.endpoint.EventDrivenConsumer@1f12e153
kksingh---serialize---main
pool-1-thread-1---deserialize----kksingh
outputkksingh
2017-06-05 12:46:32.837  INFO 29076 --- [           main] o.s.c.support.DefaultLifecycleProcessor  : Stopping beans in phase 0
2017-06-05 12:46:32.839  INFO 29076 --- [           main] o.s.i.endpoint.EventDrivenConsumer       : Removing {bridge:null} as a subscriber to the 'replyChannel' channel
2017-06-05 12:46:32.839  INFO 29076 --- [   

回答1:


Your deserializer is deserializing multiple packets...

pool-1-thread-1---deserialize----
pool-1-thread-1---deserialize----
pool-1-thread-1---deserialize----
pool-1-thread-1---deserialize----

Which produces 4 reply messsages; the gateway can only handle one reply which is why you see that ERROR message.

You deserializer needs to be smarter than just capturing "available" bytes. You need something in the message to indicate the end of the data (or close the socket to indicate the end).



来源:https://stackoverflow.com/questions/44357171/my-tcp-client-using-spring-integration-not-able-to-get-response

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!