web-dev-qa-db-fra.com

Java: exception d'expiration du délai de lecture du socket

J'essaie de faire appel à un processus très difficile. Sa durée de travail moyenne est estimée à 9-10 minutes.

Lorsque j'exécute le processus, j'ai défini le délai d'expiration pour un nombre ridiculement énorme: 99999999.

Après 2 minutes, j'obtiens l'erreur suivante: 

Java.net.SocketTimeoutException: lecture expirée

J'ai essayé de jouer avec un peu plus, et j'ai mis le délai d'attente à 3000, et après 3 secondes comme prévu, j'ai eu la même erreur.

Avez-vous une idée de la raison pour laquelle socket.setSoTimeout(99999999) la définit à 120000 max?

11
Urbanleg

J'ai eu le même problème et la solution n'était pas d'utiliser socket.shutdownInput(); socket.shutDownOutput(); jusqu'au dernier moment de lecture ou d'écriture de données sur le socket. Cela a obligé le socket à passer à l'état FIN_WAIT et a donc attendu 2 minutes avant de fermer. Vous pouvez en savoir plus à ce sujet dans cet article

3
Rotem

Il est clair que vous ne définissez pas le délai d'expiration que vous pensez avoir ou que quelqu'un d'autre le modifie ultérieurement. Vous devrez poster du code pour obtenir des éclaircissements supplémentaires.

Notez que, selon W.R. Stevens dans TCP/IP Illustrated, Vol II, n ° 17.4, le délai d'attente est limité à un nombre de ticks de 1 000 Hz, de sorte qu'un délai dépassant 11 minutes est impossible. Ceci s’applique au code BSD.

2
user207421

Je ne sais pas comment votre application fonctionne, mais essayez de définir un délai infini timeout à la prise

public void setSoTimeout(int timeout)
              throws SocketException

Activer/désactiver SO_TIMEOUT avec le délai d'attente spécifié, en millisecondes. Lorsque cette option est définie sur un délai d'expiration autre que zéro, un appel read() sur la InputStream associée à ce socket bloquera uniquement pendant cette période. Si le délai expire, un Java.net.SocketTimeoutException est généré, même si le socket est toujours valide. L'option doit être activée avant d'entrer dans l'opération de blocage pour avoir effet. Le délai d'attente doit être > 0. Une temporisation de zéro est interprétée comme une temporisation infinie.

Si vous fournissez plus d'informations sur votre appel, je pourrai améliorer la réponse.

1
F. Mayoral