当使用tcp-inbound-gateway时,socket是超时响应被发送给它

时间:2015-03-14 06:46:41

标签: spring-integration

这就是我的配置:

<int-ip:tcp-connection-factory id="myServer"
        type="server" port="${port}" deserializer="serializeDeserialize"
        serializer="serializeDeserialize" single-use="true"
        using-nio="true" so-linger="500"
        backlog="100" so-timeout="10000"
        lookup-host="false" />

    <bean id="serializeDeserialize"
        class="org.springframework.integration.ip.tcp.serializer.ByteArrayRawSerializer" />


    <int-ip:tcp-inbound-gateway id="myGateway"
        connection-factory="myServer" request-channel="inputMessagechannel"
        error-channel="errorChannel" reply-timeout="10000"/>

    <int:service-activator input-channel="inputMessagechannel"
        ref="messageReceiver" method="process" />

虽然服务激活器在一秒钟内返回响应,但我仍然看到套接字已关闭。这是日志:

2015-03-14 11:48:15,806  WARN [pool-2-thread-1] (AbstractConnectionFactory.java:555) - Timing out TcpNioConnection 20124 : 101.222.165.210:46930:632ce959-35ca-4f8e-be7f-5be3ecc166b0
2015-03-14 11:48:17,155  INFO [pool-2-thread-14] (InputMessageReceiver.java:69) - Message from <payload printed here>
2015-03-14 11:48:17,156 ERROR [pool-2-thread-14] (TcpInboundGateway.java:105) - Connection not found when processing reply [Payload=RESPONSE][Headers={timestamp=1426313897156, id=2ae8bb69-859a-4632-ac13-1a52fa493e56, ip_tcp_remotePort=46930, ip_address=101.222.165.210, ip_hostname=101.222.165.210, ip_connectionId=101.222.165.210:46930:632ce959-35ca-4f8e-be7f-5be3ecc166b0}] for [Payload=[B@132509][Headers={timestamp=1426313897154, id=a0c2dfc9-d097-448e-bf4d-15465903cf0c, ip_tcp_remotePort=46930, ip_address=101.222.165.210, ip_hostname=101.222.165.210, ip_connectionId=101.222.165.210:46930:632ce959-35ca-4f8e-be7f-5be3ecc166b0}]

知道如何让它发挥作用吗?我猜serializeDeserialize与此有关,因为即使在将有效负载发送到SA之前,连接也会超时,或者当连接超时时转发有效负载,将其标记为消息结束:(如果这是case,然后请建议任何合适的serializeDerialize(提供的默认值不适合在这里使用,因为消息由';'分隔,并且只有在发送对第一条消息的响应时才能接收到后续消息。

1 个答案:

答案 0 :(得分:0)

阅读the documentation

ByteArrayRawSerializer检测到对端关闭套接字的流结束;您需要使用配置为ByteArraySingleTerminatorSerializer的{​​{1}}作为终止字符。