Spring Integration TCP - 在发送数据之前启动与消息的握手

时间:2018-02-05 22:19:26

标签: sockets tcp spring-integration

我正在使用@MessagingGateway将数据发送到服务器。我为出站网关配置了AbstractClientConnectionFactory和@ServiceActivator。

为了将数据发送到我的服务器,我需要在启动连接时发送握手消息。如果来自服务器的响应是我期望的握手响应,那么我发送有意义的数据。我最初的解决方案是

if (gateway.handshake(HANDSHAKE).equals(HANDSHAKE_RESPONSE)) gateway.sendData(data);

当我扩展时,这不是很好,因为我通过tcp加倍调用,因为我只需要在连接启动时发送发送握手,而不是每次都发送。另外,我计划保持连接活着。

因此,在连接启动时,如何实现此自定义握手?

@Bean
public AbstractClientConnectionFactory clientCF() {
    TcpNetClientConnectionFactory tcpNetClientConnectionFactory = new TcpNetClientConnectionFactory(host, port);

    tcpNetClientConnectionFactory.setSerializer(new serializerDeserializer());
    tcpNetClientConnectionFactory.setDeserializer(new serializerDeserializer());
    tcpNetClientConnectionFactory.setSoKeepAlive(true);
    tcpNetClientConnectionFactory.setSoTimeout(soTimeout);
    return tcpNetClientConnectionFactory;

}

@Bean
@ServiceActivator(inputChannel = "toTcp")
public MessageHandler tcpOutGate(AbstractClientConnectionFactory connectionFactory) {
    TcpOutboundGateway gate = new TcpOutboundGateway();
    gate.setConnectionFactory(connectionFactory);
    return gate;
}


@Bean
public MessageChannel fromTcp() {
    return new DirectChannel();
}

1 个答案:

答案 0 :(得分:1)

请参阅Connection Interceptors

  

可以使用对TcpConnectionInterceptorFactoryChain的引用来配置连接工厂。拦截器可用于向连接添加行为,例如协商,安全性和其他设置。框架当前没有提供拦截器,但是,例如,请参阅源存储库中的InterceptedSharedConnectionTests。

     

测试用例中使用的HelloWorldInterceptor的工作方式如下:

     

...

虽然框架中没有标准拦截器,但有test cases that show how to use them for an initial handshake, for example here  和here

测试比你需要的更复杂,因为它们测试了多个嵌套拦截器。

第一次打开套接字时hello world test interceptors发送Hello并期望World!。它们为客户端和服务器端实现握手。