viernes, 7 de diciembre de 2007

Scheduler en Java

Algunas aplicaciones necesitan que ciertos procesos se disparen automáticamente, sin intervención del usuario, en éstos casos precisamos una herramienta que nos permita planificar su ejecución.

En Java hay varios frameworks que funcionan como "Scheduler" o "Planificador de Tareas", personalmente he usado en varios proyectos uno que se llama Quartz, y con muy buenos resultados. Es sencillo de configurar y no depende del ambiente en donde corre el aplicativo, funciona en todos los application servers, al menos en Tomcat y en JBoss no he tenido inconvenientes.

Los pasos básicos para configurar Quartz son:

1. Bajar el framework desde la web del proveedor e incluir las librerías requeridas en el aplicativo
2. Crear una clase que implemente la interface Job y en el método execute escribir la lógica que necesitamos ejecutar periódicamente
3. Instanciar un SchedulerFactory (se debería hacer cuando el aplicativo esta iniciándose) y registrar el job anterior. Por ejemplo si en una aplicación web tenemos un listener o un servlet que se ejecuta por única vez podemos usar el siguiente código:

StdSchedulerFactory factory = new StdSchedulerFactory();
Scheduler scheduler = factory.getScheduler();
scheduler.start();
JobDetail jobDetail = new JobDetail("exampleJob", Scheduler.DEFAULT_GROUP, ExampleSchedulerJob.class);
int hour = 17;
int minute = 50;
Trigger trigger = TriggerUtils.makeDailyTrigger(hour, minute);
trigger.setName("exampleTrigger");
scheduler.scheduleJob(jobDetail, trigger);
this.getServletContext().setAttribute("QUARTZ_SCHEDULER_KEY", scheduler);


En éste caso registramos la clase ExampleSchedulerJob (es la que tiene la lógica del proceso, implementa la interface Job) para que se ejecute todos los días a las 17:50 (makeDailyTrigger).
Además la clase TriggerUtils brinda varias opciones para configurar tareas semanales, mensuales, etc.

Para implementar casos mas avanzados les recomiendo la documentación de Quartz, es muy completa.

Hasta el próximo post!

No hay comentarios: