2014-01-19 39 views
0

我试图实现使用Spring Integration的以下情形发送消息:Spring集成接收并通过TCP连接

  • 我需要通过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。随着this例如

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 

,您可以发送邮件和处理来自服务器的应答,但连接将关闭,而不是不停地监听来自服务器的消息。任何想法如何解决这个问题?

在此先感谢。

Eduardo

+1

您需要更清楚地解释问题;是发送java序列化对象的服务器?如果是这样,这个日志意味着消息不完整,并且解串器正在等待更多数据。采用线程转储(使用'jstack'或'VisualVM')来查看线程正在做什么。 –

+0

服务器发送像这样的文本字符串/ * 00FF99 * /。我需要的是捕捉这些字符串。例如,他们真的来了,但不知道如何将其转换成存储在数据库中。 – earanda

回答

6

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

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

如果您的数据不符合这些标准格式之一,则需要提供自定义解串器。开始的好地方是看standard deserializersAbstractByteArraySerializer的子类。

+0

感谢您的协助。 我使用了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.springframework.integration.MessageDeliveryException :调度员没有用于通道输入的订户。 – earanda

+0

您没有订阅“输入”的任何内容。直接渠道至少需要一个用户。如果您只是测试并希望看到导线分接头,请在通道中添加一个“”子元素,使其成为“QueueChannel”。 –

+0

完成。非常感谢。 – earanda