2017-09-13 1 views
1

J'ai deux beans créant une connexion socket client vers un serveur: AbstractClientConnectionFactory et TcpOutboundGateway.Quels délais d'attente pour définir sur Socket créé avec l'intégration de printemps?

Le serveur offre un délai d'attente de 1 minute. Question: quels délais dois-je définir sur les beans afin que spring/java ne termine pas la connexion avant le timeout du serveur?

Les propriétés suivantes sont disponibles:

factory.setSoTimeout(); 
gateway.setRequestTimeout(); 
gateway.setRemoteTimeout(); 

Lequel de ces délais d'attente est correcte pour définir du point de vue des clients? Ou devrais-je simplement les mettre tous à 60000L?

Je demande parce que je suis juste en utilisant factory.setSoTimeout(60000L) maintenant, et obtenir des délais de socket après 10sec. Alors peut-être que je dois en plus définir les délais d'expiration de la passerelle?

J'ai également découvert que gateway.setRemoteTimeout(60000L) empêche le délai d'attente uniquement lorsqu'il est défini. Il est donc probablement correct de définir également cette valeur (bien que je ne comprenne pas pourquoi timeout doit être configuré deux fois).

Encore la question reste ce que .setRequestTimeout() est pour.

Répondre

1

factory.setSoTimeout();

Le délai d'attente SO est placé sur la douille elle-même; Si aucune réponse n'est reçue dans ce délai, le thread du lecteur reçoit une exception. Si nous n'avons pas envoyé de message récemment (ce qui signifie que nous attendons une réponse), le socket est fermé. Si nous avons envoyé un message récemment, nous attendons un autre délai de socket, après quoi le socket est fermé.

gateway.setRequestTimeout();

Ceci est valable seulement si l'usine singleUse est faux (ce qui signifie une seule connexion partagée). C'est le moment où nous attendons d'avoir accès au socket si une autre requête est en cours. Puisque TCP n'a pas de mécanisme naturel pour la corrélation demande/réponse, nous ne pouvons pas avoir 2 demandes (ou plus) en attente, donc la deuxième demande doit attendre que la première soit terminée. Si singleUse est vrai, un nouveau socket est utilisé pour chaque requête, ce qui n'est pas nécessaire. Le CachingClientConnectionFactory fournit un mécanisme pour utiliser un pool de sockets partagées. Encore une fois, ce délai ne s'applique pas (mais le pool a un délai d'expiration si toutes les sockets sont utilisées).

gateway.setRemoteTimeout();

Ceci est la durée pendant laquelle la passerelle attendra une réponse; si cela expire, le socket est fermé. SO timeout et remoteTimeout font effectivement la même chose; juste avec différentes implémentations.

Vous pouvez définir au moins l'heure à laquelle vous attendez une demande ou laisser le délai d'attente SO à la valeur par défaut (infini).