2010-02-22 10 views
6

He configurado una aplicación web Wicket + Hibernate + Spring que implica recopilar algunos datos (tener algunos archivos generados y devueltos), almacenar esto en una base de datos, crear algunas imágenes y mostrar todo esto en una página webWicket: cómo manejar tareas largas

Todo esto funciona bien para tiradas cortas, pero a veces la recopilación de datos (que implica el crujido de un número remoto) lleva demasiado tiempo (más de 20 minutos) y se agota el tiempo de espera. Intenté resolver esto utilizando dos enfoques, pero ambos muestran algunos problemas.

El primer enfoque fue usar AjaxLazyLoadPanel sy simplemente hacer todo dentro del getLazyLoadComponent. Esto funcionó bien para las tiradas cortas, pero para las carreras de más de 20 minutos, los LazyLoadComponents no se cargan (buen oxímoron) debido a los tiempos de espera.

El segundo enfoque consistía en crear un Fragmento intermedio con AjaxSelfUpdatingTimerBehavior añadido con una duración establecida en 10 segundos, que sondeó para los archivos que se crearon en el crujido de números. Esto parece hacer que las tareas se ejecuten en segundo plano sin problemas, pero falla cuando los datos devueltos necesitan almacenarse en la base de datos. Estoy usando el patrón Open Session in View, pero quizás esto falla al intentar almacenar datos después de 20 minutos. (La solución podría estar en resolver esto ...).

Debido a los problemas anteriores Ahora estoy leyendo sobre enfoques alternativos para manejar estas tareas de larga ejecución y encontré:

ahora estoy preguntando si alguno de estos podría ser más adecuado para resolver los problemas de tiempo de espera que tengo tanto en la ejecución de las tareas y el almacenamiento de los datos en la base de datos después, o si alguien tiene alguna otra solución que pueda ayudar en esta situación.

Me gustaría saber si un nuevo enfoque es viable antes de pasar otro día implementando algo que podría no funcionar después de todo.

Saludos,
Tim

Respuesta

3

sé que hemos tenido éxito en el uso de un panel con un AjaxSelfUpdatingTimerBehavior adjunto. La tarea y la pieza de resultados están separadas de la lógica de vista, pero están accesibles para la vista a través de un servicio que usted crea. La implementación del servicio que hemos utilizado es responsable de iniciar TheadPool o ExectutorService para ejecutar las tareas individuales. El servicio puede proporcionar una forma de controlar el progreso/estado del trabajo/llamada en particular que se está llevando a cabo. Una vez que se completa, también debe hacer que los datos estén disponibles para la vista. La inyección de una SessionFactory en la implementación del servicio (o DAO inyectado) debería ser suficiente para crear la HibernateSession fuera de una WebSession.

+0

Gracias, eso es algo en lo que pensé después de publicar la pregunta también (formular una pregunta es como esquivar el hule de esa manera). Todavía tendré que averiguar si esto realmente resolverá el problema, ya que los registros no registran nada sobre las sesiones con tiempo de espera excedido. Solo la ausencia de los resultados en la base de datos es aceptable. Se actualizará si descubro más. – Tim

+1

Terminé yendo por este enfoque y no he tenido ningún problema desde ... ¡Gracias! – Tim

+0

¡Es bueno escuchar a Tim! – Matt