JSF, cómo iniciar un hilo separado para manejar la generación de pdf y renderizar directamente la vista

Usualmente uso una página jsf con algunos campos. El usuario finalmente llama a una función de un bean administrado con

 <h:commandButton value="Go" action="#{myManagedBean.myFunction}"/>

En myFunction, se genera un pdf con la biblioteca de platillos voladores y se envía un correo electrónico con el archivo pdf como archivo adjunto.

Mi problema: la generación de PDF lleva un tiempo... Entonces, cuando el usuario hace clic en el botón de comando h:, se envían los datos y la página se procesa durante mucho tiempo...

Cómo representar la vista jsf rápidamente para el usuario y comenzar en un hilo separado el procesamiento de PDF (y enviar el correo más tarde).

Cualquier ayuda seria apreciada ! Cristóbal

preguntado el 03 de mayo de 12 a las 19:05

1 Respuestas

Esta pregunta no depende realmente de JSF ni de Spring. Ya que ha etiquetado su pregunta con primavera, eche un vistazo aquí. TaskExecutor es una API abstracta para el procesamiento asíncrono. Si no desea una dependencia de resorte, use java.util.concurrent.Executor, Por ejemplo ThreadPoolExecutor.

Con un solo ThreadPoolExecutor para esta tarea, por ejemplo, un singleton de primavera, puede controlar cuántos subprocesos de generación de PDF pueden ejecutarse en paralelo configurando el tamaño de grupo apropiado.

executor.execute(new Runnable() {
  public void run() {
    Reader r = generatePDF(someData);
    sendEmail(r, userData);
    r.close(); // in finally preferably
  }
}

Si desea actualizar la GUI de JSF después de que se realiza la generación de pdf, puede intentar alguna implementación de inserción, pero evitaría esto si es posible.

contestado el 03 de mayo de 12 a las 20:05

Muchas gracias ! exactamente lo que necesito, solo agrego antes de ExecutorService executor = Executors.newFixedThreadPool(10); - usuario712904

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.