2014-01-19 72 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