我在Spring Integration中实现了一个简单的TCP连接工厂:
@Bean
@ServiceActivator(inputChannel = "toTcpChannel")
public TcpSendingMessageHandler tcpOutClient() throws Exception {
TcpSendingMessageHandler sender = new TcpSendingMessageHandler();
sender.setConnectionFactory(clientFactory());
sender.setClientMode(false);
sender.afterPropertiesSet();
return sender;
}
@Bean
public AbstractClientConnectionFactory clientFactory() {
final TcpNioClientConnectionFactory factory = new TcpNioClientConnectionFactory(tcpHost, tcpPort);
factory.setSingleUse(true);
return factory;
}
@EventListener
public void handleTcpConnectionOpenEvent(TcpConnectionOpenEvent event) throws Exception {
LOGGER.info("TCP connection OPEN event: {}", event.getConnectionId());
// HERE I would like to have "myCustomID" header here.
}
我正在寻找获取我在生产的TcpConnectionOpenEvent(或类似的拦截器)中通过Gateway提供的自定义ID
@Gateway(requestChannel="toTcpChannel")
public void sendToTcp(@Payload String message, @Header("myCustomID") Long myCustomID);
我知道这是一个事件而不是消息,但我知道如何以任何其他方式获取我将在输入通道中收到的连接ID。
我正在创建一种my custom id – connection id
的哈希映射。
我不能通过聚合器使用自定义关联,因为响应消息将不包含有关先前发送的消息的任何信息。欢迎任何建议。
答案 0 :(得分:0)
哦!我知道了。不确定您要在自定义TcpSendingMessageHandler
中执行的操作,但只要ApplicationEventPublisher
是单线程的,您可以将connectionId
存储在ThreadLocal
变量中并获取发送操作后从那里开始。