【问题标题】:interaction in spring integration TCP Serverspring集成TCP Server中的交互
【发布时间】:2017-03-16 02:21:11
【问题描述】:

我知道 spring 集成有 TcpInboundGateway、TcpOutboundGateway 和 ByteArrayLengthHeaderSerializer 来处理来自 TCP 端口的数据。

ByteArrayLengthHeaderSerializer 如果 TCP 服务器需要读取从客户端发送的所有数据然后处理它,则效果很好。 (请求和响应模型)

例如,如果客户端发送 9AAPL,那么服务器可以发送 AAPL 价格。

我正在寻找一种客户端可以与服务器交互而无需在多个请求中关闭连接的方式。

例如:如果客户端发送 9AAPL,那么服务器应该发送 AAPL 价格并等待来自客户端的另一个请求而不关闭连接。这种交互可以一直持续到客户端在 50 秒内发送 5 个或没有来自客户端的响应。

您能否建议需要用于此交互行为的 Spring 集成类(TCP 网关、序列化器等)?

我们正在使用 spring integration 4.2.6.RELEASE 版本和 java 8。这些版本足够好还是我们需要升级到新版本?

更新: 这是我的弹簧配置:

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

    <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"/>

谢谢

【问题讨论】:

    标签: java sockets tcp spring-integration


    【解决方案1】:

    请显示您的配置 - 您想要的是默认行为。

    只有将singleUse 设置为true,网关才会关闭套接字。

    当然,您的客户端也不能关闭套接字。

    设置soTimeout在这段时间内没有收到任何请求后关闭套接字。

    您不需要需要更新的版本,但我们始终建议使用最新的 (4.3.4)。

    【讨论】:

    • 将 singleUse 设置为 true 非常有助于保持连接打开。第二个请求是否来自同一个序列化器实例?序列化程序何时将数据交给 ServiceActivator?可以自定义序列化程序以将数据多次发送到 ServiceActivator 吗?可能那不是一个干净的方式。请建议如何维护请求之间的状态?谢谢
    • false 保持套接字打开,而不是 true。当接收到所有数据时,该消息被释放。默认的解串器需​​要 4 字节的二进制长度;您可以通过序列化器 bean 上的 constructor-arg 将其减少到 1 个字节(最多 255 个数据字节)。长度必须是二进制的。 0x04 + 'APPL'(或0x00000004 + 'APPL',带有默认的 4 字节长度标头)。使用 9APPL 和 1 字节标头,解串器需要 0x39 (57) 字节数据(0x39 是 ascii 9 的二进制值)。如果您希望长度为 ascii(而不是二进制),则需要自定义(反)序列化器。
    • 关于状态,你需要具体解释一下你说的是哪种状态。
    • 感谢您澄清字节大小。示例状态:在第一个请求中,我可以获得股票数量和股票代码,例如 5AAPL,第二个请求可以只是股票代码,例如 GOOG。第二个请求可以使用与第一个请求相同数量的共享。在哪里保持状态?是否可以在 Serializer 中保持共享数量并多次调用 ServiceActivator?
    • 最好将状态保留在服务本身中;如果您需要处理多个并发客户端,您可以将其存储在一个映射中,以ip_connectionId 消息头为键。您可以使用应用程序事件侦听器来检测连接关闭,允许您在必要时清除状态(例如,客户端在完成他的一系列请求之前死亡)。
    猜你喜欢
    • 2017-03-21
    • 2020-10-11
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-30
    相关资源
    最近更新 更多