Spring Integration通过TCP连接接收和发送消息

3

我正在尝试使用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 的例子,你可以发送消息并处理服务器的回复,但连接会关闭而不是保持监听来自服务器的消息。有什么解决办法吗?

提前感谢。

Eduardo


1
你需要更清楚地解释问题;服务器是否正在发送Java序列化对象?如果是这样,那么这个日志对我来说意味着消息不完整,反序列化程序正在等待更多的数据。使用jstackVisualVM获取线程转储以查看线程正在做什么。 - Gary Russell
服务器会发送像这样的文本字符串 /00FF99/。我需要捕获这些字符串。它们确实到达了,但是不知道如何将其转换并存储在数据库中。 - earandap
1个回答

8
TCP是一种流式协议,没有"消息"的概念。该框架使用序列化器(用于输出)和反序列化器(用于输入)将消息编码/解码到/从流中。
该框架有许多标准反序列化器(例如,消息由\n\r\n等分隔符分隔)。
如果您的数据不适合这些标准格式之一,则需要提供自定义反序列化器。一个好的起点是查看标准反序列化器并子类化AbstractByteArraySerializer

感谢您的帮助。我使用了ByteArrayRawSerializer,但现在出现以下异常:2014-01-20 11:40:34 ERROR TcpNioConnection:280 - Exception sending message: [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.springframework.integration.MessageDeliveryException: Dispatcher has no subscribers for channel input. - earandap
您没有订阅任何内容到“input”。直接通道至少需要一个订阅者。如果您只是在测试并想查看线路窃听,请将<queue/>子元素添加到通道中,使其成为QueueChannel - Gary Russell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接