2017-10-01 2 views
0

J'envoie des messages entre un client TCP - paire socket serveur en utilisant Spring Integration en utilisant quelque chose comme çaL'ordre des messages envoyés au "clientOutChannel" est-il garanti lors de sa réception dans "serverInChannel"?

envoyer des messages client à l'aide

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

côté réception du serveur en utilisant

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

Ma question est l'ordre des messages envoyés au "clientOutChannel" est-il garanti lors de sa réception dans "serverInChannel"? Si non, alors quel est le meilleur pour y parvenir?

Je reçois les messages en utilisant un activateur de service

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

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

Merci

Répondre

1

Lorsque vous posez des questions comme celle-ci, vous devez fournir plus de contexte et de configuration - tels que les propriétés de votre usine de connexion. Sinon, nous devons faire trop de spéculations.

Cela étant dit; côté client, si les messages sont envoyés sur le même thread et sur le même socket (single-use=false - par défaut), les messages iront sur le réseau dans l'ordre envoyé.

Si elles sont envoyées sur différents filetages ou douilles, il y a une condition de concurrence et l'ordre n'est pas garanti. Côté serveur, si les messages sont envoyés dans le même ordre par le client, ils seront émis dans l'ordre, tant que using-nio est false côté serveur. Quand using-nio=true sur le côté serveur, il n'y a aucune garantie de commande puisque les messages pourraient être expédiés sur différents threads. Pour récapituler - tant que vous n'utilisez pas NIO, vous utilisez une connexion unique, et vous envoyez les messages sur le même fil, ils seront reçus dans l'ordre envoyé.

+0

Merci Gary, c'est logique. J'ai ajouté plus de contexte à la question initiale. – dan