SI를 처음 사용했습니다. 내가 쓰고있는 응용 프로그램 서버의 시작 지점으로 SI TCP Multiplexing 예제의 코드를 사용하고 있습니다. 서비스의 호출자가 이미 존재하며 바이트 길이 헤더 앞에 접두사가 붙은 페이로드를 보낼 것입니다. 응답의 상관 관계에 약간의 문제가 있습니다. 아래에서 볼 수 있듯이 멀티플렉싱 예제를 변경하여 publish-subscribe-channel을 푸시하기 전에 들어오는 요청에 상관 ID 헤더를 먼저 추가했습니다. 나머지 코드는 예제와 거의 같습니다.스프링 통합 멀티플렉싱 상관
그래서 문제가 있습니다. 메시지 페이로드를 serialize하고 보냅니다 TcpSendingMessageHandler에서 MessageController 호출시 상관 ID 머리글을 사용할 수 없습니다. 상관 관계 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"/>
Gary에게 감사드립니다. 어쩌면 혼란스럽지 않을지도 모르겠군요 :). 그래서 몇 천개의 분산 POS 장치 (토큰)에 대해 토큰 화 서비스를 처리하는 서버가 있습니다. pos 장치는 tcp를 통해 서버와 인터페이스해야하므로 SI를 돌려주고 싶습니다. 그것은 단순한 요청이어야합니다 - pos에서 서버로/서버로 응답합니다. 그렇다면 간단한 인바운드 게이트웨이를 사용할 수 있습니까? 그리고 서비스 액티베이터에서 응답 ... 나는 서버가 필요합니까? 내가하고있는 일은 협업 채널 어댑터 예제와 거의 동일해야한다고 생각합니다. – user2824203
방금 진흙 파이를 만들었 으면 알려주세요.이 방법을 선호합니다 (감사합니다). 나는 헤더 매퍼 fn을 가지고 돌아 다닐 것이다. 고마워. – user2824203
만약 여러분이 서버라면 인바운드 게이트웨이와 서비스 액티베이터가 필요합니다 - 간단한 tcp-client-server 샘플 (https://github.com/spring-projects/spring-integration-samples/tree)을보십시오./마스터/기본/TCP 클라이언트 - 서버). 멀티 플렉스 샘플은 게이트웨이 대신 비동기 어댑터를 사용할 때 '클라이언트'측에서 상관 관계를 수행하는 고급 기술을 설명합니다. –