2009-10-06 8 views
1

J'ai une connexion qui devrait recevoir un signal toutes les deux minutes.SocketTimeoutException sous Solaris 9 non lancé

Toutefois, quelque chose se produit occasionnellement et le réseau se détériore. Pour une raison quelconque, Solaris pense que la connexion est toujours active, aucune exception IOException n'est déclenchée localement, mais une connexion est déclenchée à distance.

J'ai défini un délai d'attente sur le socket, et lors du débogage à partir d'un environnement de test Windows XP, nous pouvons confirmer qu'après deux minutes et dix secondes, le délai expire comme prévu.

Y a-t-il un chant magique que je ne récite pas pour que l'exception soit augmentée?

public void run() { 
    this.connect(); 
    while (true) { 
     try { 
      InputStreamReader reader = new InputStreamReader(this.socket.getInputStream()); 
      OutputStreamWriter writer = new OutputStreamWriter(this.socket.getOutputStream(), "ISO-8859-1"); 
      for (int errorCount = 0; errorCount < 15;) { 
       if (!this.readResponse(reader, writer)) { 
        errorCount++; 
       } 
      } 
      this.logger.error("read incomplete message for 15 times, reset the connection"); 
     } catch (Exception e) { 
      this.logger.error("read response error", e); 
     } finally { 
      this.reconnect(); 
     } 
    } 
} 

private boolean readResponse(InputStreamReader reader, OutputStreamWriter writer) throws IOException { 
    int length = 0; 
    for (int i = 0; i < 2; i++) { 
     int ch = reader.read(); 
     if (ch < 0) { 
      this.logger.error("read response buffer length error"); 
      return false; 
     } 
     length = length * 256 + ch; 
    } 
return true; 
} 

est le début de la méthode readResponse.

La méthode bloque sur int ch = lecteur.read(); dans readResponse, comme je m'attendais mais l'exception SocketTimeoutException n'est jamais levée.

Des idées?

Le code fonctionne dans tous les cas sauf les délais d'expiration.

Merci pour toute aide.

+3

Vous avez quitté la partie pertinente de votre code: Où, quand et comment vous définissez le délai d'attente de prise? – jarnbjo

Répondre

0

Je me demande si vous pouvez faire quelque chose avec:

if (reader.ready()) { int ch = reader.read(); } 

Et peut-être un court délai d'attente pour dormir entre les appels de cette méthode.

Questions connexes