Hay todo tipo de maneras de hacer esto.
Uno, puede usar un temporizador EJB para crear un proceso de ejecución única que se iniciará inmediatamente. Esta es una buena técnica para generar procesos en el fondo. Un temporizador EJB está asociado con una implementación específica de Session Bean. Puede agregar un temporizador EJB a cada Session Bean que desee para poder hacer esto, o puede tener un solo Session Bean que luego puede invocar la lógica de la aplicación a través de algún mecanismo de despacho.
Para mí, paso una cantidad serializable de parámetros junto con un nombre de clase que cumple una interfaz específica para un Session Bean genérico que luego ejecuta la clase. De esta manera, puedo copiar fácilmente cualquier cosa.
Una advertencia sobre el temporizador EJB es que los temporizadores EJB son persistentes. Una vez que crea un temporizador EJB permanece en el contenedor hasta que su trabajo finaliza o se cancela. El problema es que si tiene un proceso largo y el servidor se cae, cuando se reinicia el proceso continuará y volverá a realizar una copia de seguridad. Tenga en cuenta que esto puede ser algo bueno, pero solo si su proceso está preparado para reiniciarse. Pero si tienes un proceso simple que itera a través de "10,000 artículos", si el servidor deja de funcionar en el artículo 9,999, cuando vuelve a aparecer puedes verlo simplemente comenzando de nuevo en el ítem 1. Todo es factible, solo una advertencia que debes tener en cuenta de.
Otra forma de hacer un fondo de algo es que puede usar una cola JMS. Coloque un mensaje en la cola y el controlador se ejecuta de forma sincrónica desde el resto de la aplicación.
La parte inteligente aquí, y algo que también he hecho aprovechando el trabajo con el Timer Bean, es que puede controlar cuántos "trabajos" se ejecutarán según la cantidad de instancias de MDB que configure el sistema.
Por lo tanto, para la tarea específica de ejecutar un proceso en múltiples partes paralelas, tomo la tarea, la divido en "pedazos" y luego envío cada pieza a Message Queue, donde los ejecutan los MDB. Si permití 10 instancias del MDB, puedo tener 10 "partes" de cualquier tarea ejecutándose simultáneamente.
Esto realmente funciona sorprendentemente bien. Hay un poco de sobrecarga dividiendo el proceso y enrutando a través de la cola JMS, pero eso es básicamente "tiempo de inicio". Una vez que se pone en marcha, obtienes un beneficio real.
Otra ventaja del uso de Message Queue es que puede ejecutar sus procesos de ejecución larga en una máquina separada, o puede crear fácilmente un clúster de máquinas para manejar estos procesos. Sin embargo, la interfaz es la misma y el código no conoce la diferencia.
Descubrí que una vez que ha relegado a un segundo plano el proceso, puede pagar el precio de tener un acceso menos instantáneo a ese proceso. Es decir, no hay ninguna razón para supervisar directamente las clases de ejecución directamente, solo pídales que publiquen información y estadísticas interesantes a la base de datos, o JMX, o lo que sea, en lugar de tener algo que pueda supervisar el objeto directamente porque comparte el mismo espacio de memoria.
que era fácilmente capaz de establecer un marco que permite ejecución de la tarea, ya sea en el temporizador EJB o en la cola de dispersión de los BMD, las tareas son las mismas, y pude controlar su progreso, detenerlos, etc.
Puede combinar la técnica de dispersión para crear varios trabajos EJB Timer. Una de las ventajas gratuitas del MDB es que actúa como un grupo de subprocesos que puede regular sus trabajos (para que no sature repentinamente su sistema con demasiados procesos de fondo). Obtienes esto "gratis" simplemente aprovechando las funciones de administración de EJB en el contenedor.
Finalmente, Java EE 6 tiene un nuevo calificador "asincrónico" (o algo) para los métodos Session Bean. No conozco los detalles sobre cómo funciona esto, ya que aún tengo que jugar con un nuevo contenedor Java EE 6. Pero imagino que probablemente no querrás cambiar los contenedores solo por esta instalación.
Parece que 'WorkManager' es específico de WebSphere, por lo que no es adecuado en general: http://stackoverflow.com/questions/9026516/replacing-webspheres-workmanager-in-jboss – Raedwald
Eso no se refiere al Commonj WorkManager, sino a una solución específica de IBM que lo antecede. Como ya he mencionado, commonj no es específico de IBM y está disponible en la mayoría de las plataformas. – Robin