Spring Integration TcpInboundGateway读取导致SocketException的异常:连接重置

时间:2015-12-30 06:59:10

标签: spring spring-integration

我正在使用Spring引导按照TcpInboundGateway的示例,因此不同的设备将数据发送到此网关,一切正常,但在日志中它显示以下异常:

2015-12-29 18:42:19.455 ERROR 3465 --- [ool-3-thread-47] o.s.i.i.tcp.connection.TcpNetConnection  : Read exception 106.221.159.216:38170:8765:934c050d-c4b5-4466-98ab-ee87714c3d00 SocketException:Connection reset

如果此异常重置连接,那么如何避免此重置?导致此错误的原因是什么?

我的代码如下

@SpringBootApplication
@IntegrationComponentScan
public class SpringIntegrationApplication extends SpringBootServletInitializer{


    public static void main(String[] args) throws IOException {
        ConfigurableApplicationContext ctx = SpringApplication.run(SpringIntegrationApplication.class, args);       
        System.in.read();
        ctx.close();
    }


    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(SpringIntegrationApplication.class);
    }

    private static Class<SpringIntegrationApplication> applicationClass = SpringIntegrationApplication.class;


    @Bean
    TcpNetServerConnectionFactory cf(){
        TcpNetServerConnectionFactory connectionFactory=new TcpNetServerConnectionFactory(8765);

        return connectionFactory;
    }

    @Bean
    TcpInboundGateway tcpGate(){

        TcpInboundGateway gateway=new TcpInboundGateway();
        gateway.setConnectionFactory(cf());
        gateway.setRequestChannel(requestChannel());
        return gateway;
    }

    @Bean
    public MessageChannel requestChannel(){

        return new DirectChannel();
    }


    @MessageEndpoint 
    public class Echo {

    @ServiceActivator(inputChannel="requestChannel")
    public byte[] echo(byte[] in,@SuppressWarnings("deprecation") @Header("ip_address") String ip){

        byte[] rawbytes = gosDataSerivce.byteArrayToHex(in,ip);//Process bytes and returns result

        return rawbytes;    

    }
    }

}

singleUse设置为true后,现在异常消息会略有改变。

2015-12-31 06:09:00.481 ERROR 16450 --- [ool-3-thread-10] o.s.i.i.tcp.connection.TcpNetConnection  : Read exception 106.221.146.40:9195:8765:1b4755e8-5b0c-44b9-b4e6-b3aacc25e228 SocketException:Connection reset

使用案例 我有几个客户端建立了与TcpInboundGateWay的GPRS连接并发送登录数据包,我们的服务器将回复此登录数据包。如果客户端收到服务器回复登录数据包,那么它将定期发送数据包。如果服务器无法向这些数据包发送回复,服务器也需要回复这些数据包,然后终止客户端GPRS连接,客户端将尝试再次建立连接。让我知道这个用例是否可以用TcpInboundGateWay <处理/ p>

网络跟踪分析 客户端和服务器之间的一般通信流程如下:客户端从ip发送登录数据包106.221.148.165,因此在创建名为106.221.148.165:63430:8765:cc105da2-dae4-494b-af9c-d1ba268f34f1的服务器连接时,该客户端从该ip发送后续数据包所以一切正常,但过了一段时间后,同一个客户端从另一个ip106.221.142.204发送其登录数据包。以及来自新ip的后续数据包。但是在日志中跟踪错误对于之前的连接异常发生了。

2016-01-05 05:16:14.871 ERROR 6819 --- [pool-3-thread-5] o.s.i.i.tcp.connection.TcpNetConnection  : Read exception 106.221.148.165:63430:8765:cc105da2-dae4-494b-af9c-d1ba268f34f1 SocketException:Connection reset

我已设置singleUse true,我正在使用spring integration 4.2.1

1 个答案:

答案 0 :(得分:2)

当客户端关闭套接字时会发出此消息 - 如果您的客户端只发送一条消息然后关闭套接字,您可以将singleUse设置为true并且它将禁止此消息(只要套接字正常关闭 - 消息之间。)

使用Spring Integration 4.2及更高版本,即使singleUsefalse,也不会在正常结束时发出消息。