2017-10-01 1 views
0

나는 TCP 클라이언트간에 메시지를 보내고 -이"serverInChannel"에 수신 될 때 "clientOutChannel"에 보내는 메시지 순서가 유지 관리되도록 보장됩니까?

같은 것을 사용하여 스프링 통합을 사용하여 서버 소켓 쌍은

<int-ip:tcp-outbound-channel-adapter id="tcpOutboundAdapter" 
            channel="clientOutChannel" 
            connection-factory="factoryClient" 
            client-mode="true"/> 

<int-ip:tcp-connection-factory id="factoryClient" 
           type="client" 
           host="127.0.0.1" 
           port="60000" 
           single-use="false" 
           serializer="mySerDe" 
           deserializer="mySerDe"/> 

내 질문은

<int-ip:tcp-inbound-channel-adapter id="tcpInboundAdapter" 
            channel="serverInChannel" 
            connection-factory="factoryServer" 
            client-mode="false/> 

<int-ip:tcp-connection-factory id="factoryServer" 
          type="server" 
          host="127.0.0.1" 
          port="60000" 
          single-use="false" 
          serializer="mySerDe" 
          deserializer="mySerDe"/> 

사용하여 서버 측을 수신하여 클라이언트 메시지 보내기 "clientInChannel"에 전송 된 메시지의 순서는 "serverInChannel"에서 수신 될 때 유지되도록 보장됩니까? 그렇지 않다면, 이것을 달성하기 위해 최선의 노력은 무엇입니까? 이러한 연결 팩토리 등록으로 -

는이 같은 질문을 할 때, 당신이 더 많은 상황과 구성을 제공해야하는 서비스의 활성화를

<int:service-activator id="serviceActivator" 
          ref="messageHandler" 
          method="handleMessage" 
          input-channel="serverInChannel" 
          > 
    </int:service-activator> 

<bean id="messageHandler" class="MessageHandler"/> 

감사

답변

1

를 사용하여 메시지를 수신하고 있습니다. 그렇지 않으면 우리는 너무 많은 추측을해야합니다.

그건 그렇고; 클라이언트 쪽에서 메시지가 동일한 스레드와 동일한 소켓 (기본값 :)에 전송되면 메시지는 전송 된 순서대로 유선으로 이동합니다.

다른 스레드 또는 소켓으로 보내면 경쟁 조건이 있으며 주문이 보장되지 않습니다.

서버 쪽에서 클라이언트가 동일한 소켓에서 메시지를 순서대로 보내면 서버 쪽에서 using-niofalse 인 한 순서대로 메시지가 보내집니다. 서버 측에 using-nio=true이있는 경우 메시지가 다른 스레드에서 전달 될 수 있기 때문에 순서가 보장되지 않습니다.

요약하면 NIO를 사용하지 않는 한 단일 연결을 사용하고 같은 스레드에서 메시지를 보내면 전송 된 순서대로 메시지가 전송됩니다.

+0

감사합니다. 게리,이 말이 맞습니다. 나는 원래 질문에 더 많은 배경을 추가했다. – dan

관련 문제