我正在使用Spring (Integration)
来提供套接字tcp连接。我有这个套接字的特定超时。
当超时超时时,我不仅要关闭连接(已经有效),还要返回自定义错误信息(或者不关闭连接,只返回错误信息)。这可能吗?
@Bean
public TcpConnectionFactoryFactoryBean tcpFactory(Converter converter) {
TcpConnectionFactoryFactoryBean factory = new TcpConnectionFactoryFactoryBean();
factory.setType("server");
factory.setPort("8080");
factory.setSingleUse(true);
factory.setSoTimeout(10000); //10s; how to return error message?
return factory;
}
更新
@Bean
public ApplicationListener<TcpConnectionEvent> tcpErrorListener() {
TcpConnectionEventListeningMessageProducer producer = new TcpConnectionEventListeningMessageProducer();
producer.setEventTypes(new Class[] {TcpConnectionCloseEvent.class});
producer.setOutputChannel(tcpErrorChannel()); //what to do here?
return producer;
}
答案 0 :(得分:1)
实际上任何已关闭的连接都会发出TcpConnectionCloseEvent
,您可以使用以下方式处理它:
<int-event:inbound-channel-adapter channel="connectionClosedChannel"
event-types="org.springframework.integration.ip.tcp.connection.TcpConnectionCloseEvent"/>
让您不仅可以关闭连接,还可以使用event-flow
执行任何所需的逻辑。
<强>更新强>
从JavaConfig中使用它:
@Bean
public SmartApplicationListener tcpErrorListener() {
ApplicationEventListeningMessageProducer producer = new ApplicationEventListeningMessageProducer();
producer.setEventTypes(TcpConnectionCloseEvent.class);
producer.setOutputChannel(tcpErrorChannel());
return producer;
}
@Bean
public MessageChannel tcpErrorChannel() {
return new DirectChannel();
}
答案 1 :(得分:1)
要求有点不寻常 - 客户端在收到自定义错误消息时会做什么?
目前没有简单的方法来拦截超时;您可以这样做,但您必须为连接工厂及其创建的连接对象创建子类,并覆盖handleReadException()
方法。
直接在您自己的组件中处理套接字并使用Messaging Gateway向您的流发送消息可能会容易得多。或者,只需将您的组件设为MessagingGatewaySupport
的子类。
或者,您可以在下游流程中使用某些内容(并且不设置超时)。收到消息时,安排任务在10秒内发送错误消息。当下一条消息到达时,取消计划任务并安排新任务。