2011-06-14 6 views
6

Estoy desarrollando una aplicación en JSF 2.0 y me gustaría tener un cuadro de texto de líneas múltiples que muestre los datos de salida que se leen (línea por línea) desde un archivo en tiempo real.Intercambio de datos en tiempo real sobre AJAX con múltiples hilos

Así que el objetivo es tener una página con un botón que active el motor para que comience a leer el archivo y luego muestre los resultados tal como se leen en el cuadro de texto.


que había pensado en hacer esto de la siguiente manera:

que la página local de seguimiento de lo que se ha recuperado líneas/aparece en el cuadro de texto hasta el momento.

Periódicamente, la página local sondeará el servidor usando AJAX y solicitará cualquier dato nuevo que haya sido leído (le dirá qué líneas tiene la página hasta el momento y solo recuperará las nuevas líneas desde entonces).

Esto continuará hasta que se haya recuperado por completo el archivo completo.


El problema es que el método de bean que lee desde el archivo ejecuta un ciclo while que bloquea. Entonces, para leer desde la estructura de datos a la que se está escribiendo, al mismo tiempo se requerirá el uso de hilos adicionales, ¿correcto? Escuché que generar nuevos hilos en una aplicación web es un movimiento potencialmente peligroso y que se deben usar grupos de hilos, etc.

¿Alguien puede arrojar algo de información sobre esto?


Actualización: He intentado un par de cosas diferentes sin suerte. Pero me las arreglé para que funcionase al generar un Thread por separado para ejecutar mi ciclo de bloqueo mientras que el hilo principal se podía usar para leer cuando se procesaba una solicitud AJAX. ¿Existe una buena biblioteca que podría utilizar para hacer algo similar a esto que todavía le da a JSF algún control del ciclo de vida sobre este Thread?

+0

¿Está apuntando a un contenedor Java EE 5 o 6 con soporte de EJB? – BalusC

+0

Estoy implementando esto en un servidor Tomcat sin soporte EJB ... Desearía tener acceso a la anotación @Asincrónica pero no lo hago – idolize

Respuesta

1

¿Ha considerado implementar la interfaz Future (incluida en Java5 + Concurrency API)? Básicamente, mientras lee en el archivo, puede dividirlo en secciones y simplemente crear un nuevo objeto Future (para cada sección). Luego puede hacer que el objeto regrese una vez que el cálculo se haya completado.

De esta manera evita tener que acceder a la estructura cuando todavía está siendo manipulada por el bucle y también divide las operaciones en cálculos más pequeños reduciendo la cantidad de tiempo de bloqueo (el tiempo total de bloqueo puede ser mayor pero obtiene una respuesta más rápida a otras áreas). Si mantiene el orden en el que se crearon sus objetos Future, entonces no es necesario que rastree los # de línea. Tenga en cuenta que al llamar a Future.get() se bloquea hasta que el objeto esté 'listo'.

El resto de su enfoque sería similar: realice la llamada Ajax para obtener el contenido de todos los objetos futuros 'listos' de una cola FIFO.

Creo que entiendo lo que está tratando de lograr ... tal vez un poco más de información ayudaría.

Cuestiones relacionadas