忽略Spring Integration TCP Server

时间:2016-11-05 00:22:13

标签: sockets tcp spring-integration

我知道spring集成了TcpInboundGateway,TcpOutboundGateway和ByteArrayStxEtxSerializer来处理通过TCP端口传输的数据。

如果TCP服务器需要读取客户端发送的所有数据然后对其进行处理,那么ByteArrayStxEtxSerializer工作得很好。 (请求和响应模型) 我使用single-use = false,以便可以在同一连接中处理多个请求。

例如,如果客户端发送0x02AAPL0x03,那么Server可以发送AAPL价格。

如果客户端发送0x02AAPL0x030x02GOOG0x03,我的TCP服务器正在运行。它发送AAPL和GOOG价格的价格。

如果有无效的自动收报机,TCP服务器应该忽略它并给出有效代码的价格。

当客户端发送0x02AAPL0x030x2INVALIDTICKER0x030x02GOOG0x03时,我的客户端收到AAPL价格并等待,并等待超时。

我的TCP服务器使用ServiceActivator并为INVALIDTICKER返回null。

我想知道为什么客户没有收到有效价格。 套接字outputStream被阻塞了吗?是否有任何设置允许跳过ServiceActivator的一些响应?

请帮忙。

我们正在使用spring集成4.2.6.RELEASE版本和java 8.

这是我的弹簧配置:

   <bean id="connectionSerializeDeserialize" class="org.springframework.integration.ip.tcp.serializer.ByteArrayStxEtxSerializer"/>

    <int-ip:tcp-inbound-gateway id="gatewayCrLf"
        connection-factory="crLfServer"
        request-channel="serverBytes2StringChannel"
        error-channel="errorChannel"
        reply-timeout="10000"/> <!-- reply-timeout works on inbound-gateway -->

    <int:channel id="toSA" />

    <int:service-activator input-channel="toSA"
        ref="myService"
        method="prepare"/>

    <int:object-to-string-transformer id="serverBytes2String"
        input-channel="serverBytes2StringChannel"
        output-channel="toSA"/>

    <int:transformer id="errorHandler"
        input-channel="errorChannel"
        expression="payload.failedMessage.payload + ':' + payload.cause.message"/>

谢谢

1 个答案:

答案 0 :(得分:1)

<int-ip:tcp-inbound-gateway id="gatewayCrLf"
    connection-factory="crLfServer"
    request-channel="serverBytes2StringChannel"
    error-channel="errorChannel"
    reply-timeout="10000"/> <!-- reply-timeout works on inbound-gateway -->

返回null结束了流程,但网关并不知道 - 可能是回复可能出现在另一个帖子上 - 他无法告诉他永远不会得到这个请求的回复

由于您已将回复超时设置为10秒,因此网关(套接字)线程将等待该时间,然后才能再执行任何工作。

鉴于您的流程很简单,您可以安全地将回复超时设置为0,因为当 回复时,它已经可以处理。