2010-11-23 6 views
5

J'ai joué avec les nouvelles fonctions asynchrones de Servlet 3.0 avec Tomcat 7.0.4. J'ai trouvé ce Chat Application, qui permet aux clients de se bloquer sur une requête GET pour obtenir des mises à jour de messages. Cela fonctionne très bien quand il s'agit de recevoir les messages. Le problème survient lorsque le client est déconnecté, c'est-à-dire que l'utilisateur ferme le navigateur. Il semble que le serveur n'augmente pas IOException, même si le client s'est déconnecté. Le fil de message (voir le code source du lien ci-dessus) écrit heureusement à tous les flux de sortie AsyncContext stockés.Comment savoir si le client a fermé la connexion

Est-ce un bug de Tomcat? ou est-ce que je manque quelque chose ici? Si ce n'est pas un bug, alors comment dois-je détecter si le client a fermé la connexion?

Répondre

1

Le code là à la ligne 44-47 prend soin de lui,

} catch(IOException ex) { 
    System.out.println(ex); 
    queue.remove(ac); 
} 

Et là aussi, à 75-83, en utilisant thingie délai d'attente,

req.addAsyncListener(new AsyncListener() { 
    public void onComplete(AsyncEvent event) throws IOException { 
     queue.remove(ac); 
    } 

    public void onTimeout(AsyncEvent event) throws IOException { 
     queue.remove(ac); 
    } 
}); 

EDIT: Après avoir obtenu un peu plus de perspicacité.

  1. Tomcat 7.0.4 est toujours en version bêta. Donc, vous pouvez vous attendre à un tel comportement
  2. J'ai essayé dur mais ne trouve pas la méthode setAsyncTimeout() dans le doc, ni here, ni here. Donc, je pense qu'ils l'ont laissé tomber complètement dans la version finale pour une raison valide inconnue
  3. L'exemple indique, "pourquoi devrais-je utiliser la structure au lieu d'attendre Servlet 3.0 Async API". Ce qui implique qu'il est écrit avant la chose finale

Donc, ce que je peux dire, après avoir combiné tous ces faits, que vous essayez de travailler avec la chose qui est brisée dans un sens. Cela aussi, peut-être, la raison pour des résultats différents et étranges.

+0

Eh bien cela prendrait soin si l'opération d'écriture augmenterait l'IOException qui ne se produit pas. Ainsi, vous pouvez fermer le navigateur et ne jamais obtenir cette exception. Et le timeout est dans cet exemple 10 minutes. C'est beaucoup si vous avez laissé dire des centaines de clients. – SS3

+0

J'ai essayé le code avec Glassfish v3 et il semble que je puisse obtenir l'événement onError avec Firefox, mais avec IE cela ne fonctionnera pas. C'est vraiment bizarre. – SS3

+0

@ SS3: Alors, pouvons-nous dire que vous n'avez aucun problème avec Firefox? –

Questions connexes