2014-04-28 60 views
1

我是新來的SI。我正在使用來自SI TCP Multiplexing示例的代碼作爲我寫的應用服務器的起點。服務的調用者已經存在,並將發送以字節長度頭部爲前綴的有效載荷。我對響應的相關性有點麻煩。正如您在下面看到的那樣,我改變了Multiplexing示例,在推送到發佈 - 訂閱 - 頻道之前,首先向傳入請求添加關聯id頭。其餘代碼與示例非常相似。彈簧集成複用關聯

所以,這個問題。從TcpSendingMessageHandler調用MessageController時,相關標識頭不可用,該TcpSendingMessageHandler序列化消息負載併發送它。我是否應該增加有效載荷以包含關聯ID(無相關頭文件),還是有更簡單的方法來完成所有這些工作?任何指導將不勝感激。

<gateway id="gw" 
     service-interface="is.point.tokens.server.MessageGateway" 
     default-request-channel="input"> 
</gateway> 

<ip:tcp-connection-factory id="client" 
      type="client" 
      host="${tcpClientServer.address}" 
      port="${tcpClientServer.port}" 
      single-use="false" 
      serializer="bigEndianFormatSerializer" 
      deserializer="bigEndianFormatSerializer" 
      so-timeout="10000"/> 

<channel id="input" datatype="java.lang.String"/> 

<header-enricher input-channel="input" output-channel="enriched.input"> 
    <correlation-id expression="headers['id']"/> 
</header-enricher> 

<publish-subscribe-channel id="enriched.input"/> 

<ip:tcp-outbound-channel-adapter id="outAdapter.client" 
            order="2" 
            channel="enriched.input" 
            connection-factory="client"/> 
<!-- Collaborator --> 

<!-- Also send a copy to the custom aggregator for correlation and 
    so this message's replyChannel will be transferred to the 
    aggregated message. The order ensures this gets to the aggregator first --> 
    <bridge input-channel="enriched.input" output-channel="toAggregator.client" order="1"/> 

    <!-- Asynchronously receive reply. --> 
    <ip:tcp-inbound-channel-adapter id="inAdapter.client" 
            channel="toAggregator.client" 
            connection-factory="client"/> 

<!-- Collaborator --> 

<channel id="toAggregator.client" datatype="java.lang.String"/> 

<aggregator input-channel="toAggregator.client" 
       output-channel="toTransformer.client" 
       correlation-strategy-expression="headers.get('correlationId')" 
       release-strategy-expression="size() == 2"> 
</aggregator> 

<!-- The response is always second --> 
<transformer input-channel="toTransformer.client" expression="payload.get(1)"/> 

    <!-- Server side --> 

    <ip:tcp-connection-factory id="server" 
           type="server" 
           port="${tcpClientServer.port}" 
           using-nio="true" 
           serializer="bigEndianFormatSerializer" 
           deserializer="bigEndianFormatSerializer"/> 

    <ip:tcp-inbound-channel-adapter id="inAdapter.server" 
            channel="toSA" 
            connection-factory="server" /> 

    <channel id="toSA" datatype="java.lang.String"/> 

    <service-activator input-channel="toSA" 
         output-channel="toObAdapter" 
         ref="messageController" 
         method="handleMessage"/> 

    <beans:bean id="messageController" 
       class="example.server.MessageController"/> 

    <channel id="toObAdapter"/> 

    <ip:tcp-outbound-channel-adapter id="outAdapter.server" 
            channel="toObAdapter" 
            connection-factory="server"/> 

回答

0

是的,你需要在數據中的東西,所以答覆可以相關。

但我很困惑。如果您是現有應用程序的服務器端,那麼您可以簡單地使用入站網關。

如果您確實在提供客戶端和服務器端,我們採用add a mechanism in 3.0來選擇性地添加標頭(對tcp消息),例如,使用JSON。

編輯:

從你的意見,你只需要在服務器端。所有你需要的是...

<int-ip:tcp-connection-factory id="server" 
    type="server" 
    serializer="serializer" 
    deserializer="serializer" 
    port="${port}"/> 

<int-ip:tcp-inbound-gateway id="gateway" 
    connection-factory="crLfServer" 
    request-channel="toSA" 
    error-channel="errorChannel"/> 

<int:channel id="toSA" /> 

<int:service-activator input-channel="toSA" 
    ref="messageController" 
    method="handleMessage"/> 

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

服務激活器沒有輸出通道的事實意味着框架會自動發送回覆給網關。

此處假設服務可以處理byte[];如果你需要一個字符串,你將需要一個像樣本中的變壓器。無論哪種方式,有效載荷將不包含長度標題;它被剝離(入站)並添加(出站)。

這也假設長度標題是4個字節(默認);串行器在構造函數中佔用大小...

<bean id="serializer" class="org.springframework.integration.ip.tcp.serializer.ByteArrayLengthHeaderSerializer"> 
    <constructor-arg value="2" /> 
</bean> 
+0

謝謝你的評論加里。也許它不是你,這是困惑:)。因此,我有一臺服務器正在處理幾千個分佈式銷售點設備(pos)的一些標記化服務。 pos設備需要通過tcp與服務器連接,因此我想給SI一個旋轉。它應該是一個簡單的請求 - 響應來自pos的服務器。那麼我可以使用簡單的入站網關嗎?以及服務激活者的迴應......我需要服務器嗎?我認爲,我所做的應該與合作渠道適配器的例子幾乎相同。 – user2824203

+0

請讓我知道,如果我只是做泥餡餅,並有一個這樣做(讚賞)的首選方式。我將亂七八糟的標題映射器fn。感謝那。 – user2824203

+0

如果您只是服務器,那麼您只需要一個入站網關和服務激活器 - 請參閱簡單的tcp-client-server示例(https://github.com/spring-projects/spring-integration-samples/tree /主/基本/ TCP-客戶端 - 服務器)。多路複用示例演示了一種更先進的技術,用於在使用異步適配器而不是網關時在「客戶端」執行關聯。 –