2008-09-20 9 views
0

J'ai une implémentation CometProcessor qui effectue effectivement une multidiffusion vers un nombre potentiellement important de clients. Lorsqu'un événement qui doit être propagé à tous les clients se produit, le CometProcessor doit parcourir la liste des clients qui écrivent la réponse. Si l'écriture des réponses est bloquée, il est possible que des clients potentiellement lents puissent avoir un effet négatif sur la distribution de l'événement. Exemple:Ecrit à partir d'un Tomcat 6 CometProcessor non bloquant

public class MyCometProcessor implements CometProcessor { 
    private List<Event> connections = new ArrayList<Event>(); 
    public void onEvent(byte[] someInfo) { 
     synchronized (connections) { 
      for (Event e : connections) { 
       HttpServletResponse r = e.getHttpResponse(); 

       // -- Does this line block while waiting for I/O -- 
       r.getOutputStream().write(someInfo); 
      } 
     } 
    } 

    public void event(CometEvent event) { 
     switch (event.getEventType()) { 
     case READ: 
      synchronzied (connections) { 
       connections.add(event); 
      } 
      break; 
     // ... 
     } 

    } 
} 

Mise à jour: répondre à ma propre question. Rédige d'un CometProcessor bloquent:

http://tomcat.apache.org/tomcat-6.0-doc/config/http.html

Voir le tableau en bas de la page.

Répondre

1

L'implémentation de HttpServlerResponse par Tomcat6 est la classe Response. En interne, il utilise un CoyoteOutputStream enroulé autour d'un OutputBuffer. Comme son nom l'indique, cette classe est un tampon, taille par défaut 8k. Donc je dirais à tout le moins que si vous écrivez moins de 8k alors vous n'allez pas bloquer. Vous devrez peut-être vider vos clients pour voir les données, ce qui signifie qu'en fin de compte, cela dépend de la variante de connecteur que vous utilisez. Dans la configuration de votre connecteur si vous voulez non-blocage des écritures puis spécifiez

protocol=org.apache.coyote.http11.Http11NioProtocol

Ce connecteur/Protocole est massivement configurable:

http://tomcat.apache.org/tomcat-6.0-doc/config/http.html