lunedì mag 21, 2007
lunedì mag 21, 2007
Normalmente una connessione HTTP è eseguita in modalità sincrona.
Per
ogni richiesta HTTP, il browser apre una connessione HTTP verso il Web
Server e la connessione verrà chiusa non appena il risultato viene
fornito. Il problema di questo approccio è che la pagina potrà essere
aggiornata soltanto quando l'utente la ricarica. La soluzione migliore
sarebbe inviare un messaggio al client quando accade l'evento ed il client, normalmente, non dovrebbe richiedere la pagina. Il server
dovrebbe agire in modalità push verso il web browser. Questo è ciò che esattamente
fa il supporto Comet da parte di
Per prima cosa occorre modificate il "domain.xml" nella directory di installazione <glassfish_Installation>/domains/domain1/config.xml
Sotto:
<http-listener
acceptor-threads="1" address="0.0.0.0" ......
<property name="cometSupport" value="true"/>
Fatto questo, all'interno di una servlet che voglia sfruttare l'ottimizzazione introdotta da Comet, nella init() occorre:
.......
public void init(ServletConfig config) throws
ServletException {
super.init(config);
contextPath =
config.getServletContext().getContextPath() + "/chat";
CometEngine cometEngine =
CometEngine.getEngine(); // (1)
CometContext context =
cometEngine.register(contextPath); // (2)
context.setExpirationDelay(100*1000);
// (3)
}
dove:
Il metodo "doPost" della servlet mostra un altro importante uso di Comet: CometContext è l'oggetto chiave per comunicare con gli altri client della stessa applicazione Comet.
.......
public void doPost(HttpServletRequest
request, HttpServletResponse response)
throws ServletException, IOException {
String action = request.getParameter("action");
CometEngine cometEngine = CometEngine.getEngine();
CometContext cometContext =
cometEngine.getCometContext(contextPath);
..........
e per notificare un messaggio a tutti i client connessi:
cometContext.notify("Messaggio
da " +request.getRemoteAddr(),CometEvent.NOTIFY,
+request.getRemoteAddr(),CometEvent.NOTIFY,inServlet);
..........
Se a questo punto si desidera che sia il server a fare push delle informazioni verso il browser in maniera continuativa senza richiesta occorre registrare il CometRequestHandler all'oggetto CometContext (1):
CometRequestHandler
handler
= new CometRequestHandler();
handler.clientIP = request.getRemoteAddr();
handler.attach(response.getWriter());
cometContext.addCometHandler(handler);
//(1)
return;
Per saperne di più: http://weblogs.java.net/blog/jfarcand/