我正在使用@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();
}
答案 0 :(得分:1)
可以使用对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!
。它们为客户端和服务器端实现握手。