Usando Comet para notificar al usuario la progresión de un hilo en el servidor
Joseph McCarthy de IBM Irlanda ha escrito un tutorial llamado "Using Comet for asynchronous user notification of autonomous server thread progression" sobre como usar polling y Comet (long polling) para informar al usuario de forma asíncrona a través de web sobre la progresión de un hilo autónomo (no ligado a los procesos web) que está realizando una tarea que conlleva mucho tiempo.
El problema elegido Joseph es el cálculo del número PI a través de la serie de Gregory-Leibniz, esta serie converge en teoría en el número PI. Un hilo en el servidor es creado con la finalidad de obtener un valor aproximado del número PI a través de un gran número de iteraciones. En el ejemplo de Joseph el criterio de parada del algoritmo es cuando el valor obtenido por aproximación es suficientemente igual (con un error dado) al valor de PI que conoce Java (Math.PI).
La obtención de un valor muy preciso de PI requiere muchas iteraciones que conllevan un tiempo significativo, si este cálculo lo hacemos en una aplicación web en un simple request, el tiempo requerido supera fácilmente la "paciencia" del usuario al ver una página que no termina de cargar, por otra parte es interesante conocer cual es la evolución del algoritmo más allá del valor final.
El tutorial consta de dos partes coincidentes con las dos estrategias usadas:
1) En la primera parte se usa la técnica "polling" con AJAX para informar al usuario sobre la progresión del cálculo que está realizando el hilo autónomo servidor. A través de AJAX con una periodicidad dada por un temporizador, el navegador pregunta al hilo del servidor por donde va el cálculo y para saber por supuesto si ya ha terminado.
2) En la segunda parte se utiliza Comet en su variante long-polling utilizando el soporte de Comet de ItsNat. Usando Comet el navegador del cliente es notificado de los eventos que ocurren en el servidor en el instante que ocurren, sin necesidad de que el navegador pregunte con una cierta frecuencia. La inspiración del artículo de McCarthy y especialmente esta parte del artículo se encuentra en este pequeño tutorial que escribí para Comet Daily, en donde se muestra cómo un hilo autónomo notifica eventos al usuario web cuando dichos eventos ocurren, este ejemplo también se encuentra algo más completo y en vivo aquí.
En este caso se usa el objeto CometNotifier de ItsNat, cuando el hilo que calcula el número PI quiere informar de su progresión (o de si ya ha acabado el cálculo) al usuario via web, sólo tiene que llamar al método CometNotifier.notifyClient(), dicha llamada genera un evento "Comet" especial en el servidor en el que un listener modifica el DOM en el servidor, dichos cambios se manifiestarán automáticamente e "instantáneamente" en el DOM cliente.
NOTA IMPORTANTE: el tutorial tiene importantes problemas de formateo visual y hay partes cortadas. Para poder leerlo completamente recomiendo usar Internet Explorer 6 (7 y 8 no valen) o FireFox quitando los estilos de la siguiente forma: menú View/Page Style/No Style.
Reader Comments