lunedì mag 21, 2007

Applicazioni server-push con Glassfish e Comet

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 GlassFish. Basato sull' Asynchronous Request Processing (ARP), Glassfish ha un'implementazione nativa di Comet con una elevata scalabilità ed affidabilità.

Per poterlo sfruttare è piuttosto semplice.

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" ......

occorre aggiungere:

<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:

  1. occorre inizializzare un engine Comet
  2. registrare solo il contextPath dell'applicazione al fine di condividere le richieste asincrone
  3. settare la durata dell'engine (100 secondi)

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/

About

cdb

Search

Categories
Archives
« aprile 2014
lunmarmergiovensabdom
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
    
       
Today