2014-04-28 3 views
1

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"/> 

답변

0

네, 데이터에 답이 연관 될 수 있도록해야합니다.

하지만 혼란 스럽네요. 기존 응용 프로그램의 서버 측인 경우 단순히 인바운드 게이트웨이 만 사용할 수 있습니다.

실제로 클라이언트와 서버 측을 제공하는 경우 우리는 add a mechanism in 3.0을 사용하여 (예 : JSON을 사용하여) TCP 헤더에 선택적으로 헤더를 추가했습니다.

는 편집 : 귀하의 의견에서

, 당신은 단지 서버 측이 필요합니다. 당신이 필요로하는 것은 이것뿐입니다 ...

service-activator에 출력 채널이 없다는 것은 프레임 워크가 자동으로 게이트웨이에 응답을 보내는 것을 의미합니다.

여기서는 서비스가 byte[]을 처리 할 수 ​​있다고 가정합니다. String이 필요하면 샘플과 같은 변압기가 필요하다. 어쨌든 페이로드에는 길이 헤더가 포함되지 않습니다. 그것은 (인바운드) 제거되고 추가됩니다 (아웃 바운드).

또한 길이 헤더가 4 바이트 (기본값)라고 가정합니다. serializer는 생성자에서 크기를 취합니다 ...

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

Gary에게 감사드립니다. 어쩌면 혼란스럽지 않을지도 모르겠군요 :). 그래서 몇 천개의 분산 POS 장치 (토큰)에 대해 토큰 화 서비스를 처리하는 서버가 있습니다. pos 장치는 tcp를 통해 서버와 인터페이스해야하므로 SI를 돌려주고 싶습니다. 그것은 단순한 요청이어야합니다 - pos에서 서버로/서버로 응답합니다. 그렇다면 간단한 인바운드 게이트웨이를 사용할 수 있습니까? 그리고 서비스 액티베이터에서 응답 ... 나는 서버가 필요합니까? 내가하고있는 일은 협업 채널 어댑터 예제와 거의 동일해야한다고 생각합니다. – user2824203

+0

방금 ​​진흙 파이를 만들었 으면 알려주세요.이 방법을 선호합니다 (감사합니다). 나는 헤더 매퍼 fn을 가지고 돌아 다닐 것이다. 고마워. – user2824203

+0

만약 여러분이 서버라면 인바운드 게이트웨이와 서비스 액티베이터가 필요합니다 - 간단한 tcp-client-server 샘플 (https://github.com/spring-projects/spring-integration-samples/tree)을보십시오./마스터/기본/TCP 클라이언트 - 서버). 멀티 플렉스 샘플은 게이트웨이 대신 비동기 어댑터를 사용할 때 '클라이언트'측에서 상관 관계를 수행하는 고급 기술을 설명합니다. –