我是新來的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"/>
謝謝你的評論加里。也許它不是你,這是困惑:)。因此,我有一臺服務器正在處理幾千個分佈式銷售點設備(pos)的一些標記化服務。 pos設備需要通過tcp與服務器連接,因此我想給SI一個旋轉。它應該是一個簡單的請求 - 響應來自pos的服務器。那麼我可以使用簡單的入站網關嗎?以及服務激活者的迴應......我需要服務器嗎?我認爲,我所做的應該與合作渠道適配器的例子幾乎相同。 – user2824203
請讓我知道,如果我只是做泥餡餅,並有一個這樣做(讚賞)的首選方式。我將亂七八糟的標題映射器fn。感謝那。 – user2824203
如果您只是服務器,那麼您只需要一個入站網關和服務激活器 - 請參閱簡單的tcp-client-server示例(https://github.com/spring-projects/spring-integration-samples/tree /主/基本/ TCP-客戶端 - 服務器)。多路複用示例演示了一種更先進的技術,用於在使用異步適配器而不是網關時在「客戶端」執行關聯。 –