我正在使用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
发送后续数据包所以一切正常,但过了一段时间后,同一个客户端从另一个ip
说106.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
答案 0 :(得分:2)
当客户端关闭套接字时会发出此消息 - 如果您的客户端只发送一条消息然后关闭套接字,您可以将singleUse
设置为true
并且它将禁止此消息(只要套接字正常关闭 - 消息之间。)
使用Spring Integration 4.2及更高版本,即使singleUse
为false
,也不会在正常结束时发出消息。