如何使用Spring-Integration在套接字超时上返回错误消息

时间:2014-06-02 07:47:15

标签: java spring sockets spring-integration

我正在使用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;
}

2 个答案:

答案 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秒内发送错误消息。当下一条消息到达时,取消计划任务并安排新任务。