【问题标题】:Spring Integration receive and send messages over a tcp connectionSpring Integration 通过 tcp 连接接收和发送消息
【发布时间】:2014-01-19 10:59:04
【问题描述】:

我正在尝试使用 Spring Integration 实现以下场景:

  • 我需要通过 TCP IP 连接到服务器并处理收到的消息。
  • 我需要将消息发送到接收和处理响应的同一服务器。

这是我的配置:

 <channel id="input">

        <interceptors>
            <wire-tap channel="logger"/>
        </interceptors>
    </channel>


    <logging-channel-adapter id="logger" level="DEBUG" log-full-message="true"/>

    <ip:tcp-connection-factory id="factory" type="client" host="localhost" port="9004" single-use="false"
                               using-nio="true" deserializer="javaDeserializer"/>

    <ip:tcp-inbound-channel-adapter id="inbound" channel="input" connection-factory="factory" client-mode="true"
                                    retry-interval="5000"/>

我可以接收从服务器发送的消息,但我不知道如何转换字符串。消息到达时不会调用 javaDeserializer。

2014-01-19 05:47:20 DEBUG TcpNioConnection:380 - localhost:9004:74154fb2-f77c-4036-9142-e756e53a6ac6 Reading...
2014-01-19 05:47:20 DEBUG TcpNioConnection:324 - Read 26 into raw buffer
2014-01-19 05:47:25 DEBUG TcpNioConnection:380 - localhost:9004:74154fb2-f77c-4036-9142-e756e53a6ac6 Reading...
2014-01-19 05:47:25 DEBUG TcpNioConnection:324 - Read 26 into raw buffer
2014-01-19 05:47:30 DEBUG TcpNioConnection:380 - localhost:9004:74154fb2-f77c-4036-9142-e756e53a6ac6 Reading...
2014-01-19 05:47:30 DEBUG TcpNioConnection:324 - Read 26 into raw buffer
2014-01-19 05:47:35 DEBUG TcpNioConnection:380 - localhost:9004:74154fb2-f77c-4036-9142-e756e53a6ac6 Reading...
2014-01-19 05:47:35 DEBUG TcpNioConnection:324 - Read 26 into raw buffer

以this 为例,您可以发送消息并处理来自服务器的回复,但连接将关闭并且不会继续监听来自服务器的消息。知道如何解决这个问题吗?

提前致谢。

爱德华多

【问题讨论】:

  • 你需要把问题解释的更清楚;服务器是否发送 java 序列化对象?如果是这样,该日志对我来说意味着消息不完整并且反序列化器正在等待更多数据。进行线程转储(使用jstack 或VisualVM)以查看线程在做什么。
  • 服务器发送这样的文本字符串 /*00FF99*/。我需要的是捕获这些字符串。他们真的来了但不知道如何将其转换为存储在数据库中,例如。

标签: java tcp spring-integration


【解决方案1】:

TCP 是一种流协议,没有“消息”的概念。该框架使用序列化器(用于输出)和反序列化器(用于输入)对流中的消息进行编码/解码。

框架有多个standard deserializers(例如消息由\n或\r\n等分隔)。

如果您的数据不符合这些标准格式之一,您需要提供自定义反序列化程序。一个好的起点是查看standard deserializers 并将AbstractByteArraySerializer 子类化。

【讨论】:

  • 感谢您的帮助。我使用了 ByteArrayRawSerializer 但现在出现以下异常:2014-01-20 11:40:34 ERROR TcpNioConnection:280 - 异常发送消息:[Payload=[B@18b66688][Headers={timestamp=1390236034950, id=d86b81fc -9f0a-4265-9061-2cd07f286662, ip_tcp_remotePort=9004, ip_address=127.0.0.1, ip_hostname=localhost, ip_connectionId=localhost:9004:2d2716bd-c87b-42dc-9a0a-dc2075850885}] org.springDispatcher.integration频道输入没有订阅者。
  • 你没有订阅input。直销频道至少需要一名订阅者。如果您只是在测试并想查看分接头,请将&lt;queue/&gt; 子元素添加到通道以使其成为QueueChannel。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-16
  • 1970-01-01
  • 1970-01-01
  • 2012-07-07
  • 2019-05-07
  • 2018-09-26
  • 2019-01-06
相关资源
最近更新 更多