Descripción general
De todas las formas de programar tareas en JBoss, una de las más utilizadas gracias a su flexibilidad es la creación de un servicio basándose en los MBeans disponibles en JBoss de modo de crear un servicio de programación a la medida de la necesidad puntual. Dentro de los parámetros que se requiere agregar sobre el servicio se incluye la clase a la que debe llamar el timer cada vez que se cumple el plazo o la repetición especificada.
Problemas encontrados y causas
El mayor problema es ya un clásico: no se encuentra la clase que dijimos que debe llamar el timer al momento que hacemos el deploy del servicio scheduler propio.
Esto se debe nuevamente al orden en que se hace el deploy de los distintos componentes. En particular el escenario que encontramos al intentar hacer el deploy fue el siguiente:
- El Scheduler se encuentra empaquetado en un archivo SAR.
- La aplicación está empaquetada en un EAR.
- Los dos archivos son deployados de forma independiente.
Lo que encontramos es que el archivo SAR se deployea casi al principio de la inicialización de JBoss. Cuando sucede esto, el EAR está a varios pasos de distancia de ser deployado. Si la clase que el SAR debe llamar como parte de la ejecución del timer se encuentra en el EAR, obtendremos una excepción diciendo que la clase no pudo ser encontrada.
Solución
Ante esto, tenemos dos alternativas:
- Asegurarnos de que la clase esté disponible al momento del deploy del SAR. Para esto podemos incluir la clase en el SAR o colocarla en la carpeta lib de la aplicación para estar aún más seguros.
- Si el servicio es muy particular de una aplicación y no de toda la instalación completa, puede resultar conveniente dejar el SAR dentro del EAR para que los dos componentes de deployeen simultáneamente evitando este problema. Más información sobre esto se puede encontrar en el artículo Incluir un archivo servicio (SAR) en un EAR en JBoss.