我知道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"/>
谢谢
答案 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
,因为当 回复时,它已经可以处理。