scheduled quartz examples example ejemplo spring quartz-scheduler

spring - examples - Ejemplo de Java: Programación dinámica de trabajos con Quartz



scheduler java (4)

Quiero exponer una interfaz de usuario para definir Quartz JOBs dinámicamente. Donde el usuario debe tener la facilidad de definir propiedades de TRABAJOS como nombre de TRABAJO, expresión cron o intervalo de tiempo, clase java específica para tareas, etc.

¿Hay algún código abierto que facilite esta característica? O bien, si quiero crear mi propio módulo para el Programador dinámico de cuarzo, ¿cuál debería ser la forma de hacerlo?


Código de ejemplo para Dynamic Quartz JOB Scheduling:

Dependencias Maven

<dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>1.8.5</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${spring.version}</version> </dependency>

Archivo de contexto de aplicación (dynamic-jobs.xml)

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springmodules.org/schema/ehcache http://www.springmodules.org/schema/cache/springmodules-ehcache.xsd"> <!-- The Task Bean--> <bean id="myTask" class="com.xxx.example.dynamicjob.MyTask" /> <!-- The quartz scheduler configuration --> <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"/> </beans>

Clase de Java para tareas

package com.xxx.example.dynamicjob; public class MyTask { public void performAction() { System.out.println("Hey, you reached me...:)"); } }

Clase de Java para crear trabajo dinámico

package com.xxx.example.dynamicjob; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.core.io.ClassPathResource; import org.springframework.scheduling.quartz.CronTriggerBean; import org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean; public class DynamicJobExample { /** * @param args */ public static void main(String[] args) { ClassPathResource res = new ClassPathResource("dynamic-jobs.xml"); XmlBeanFactory factory = new XmlBeanFactory(res); //get the quartzFactory bean Scheduler scheduler = (Scheduler) factory.getBean("scheduler"); //get the task bean MyTask myTask = (MyTask) factory.getBean("myTask"); try { // create JOB MethodInvokingJobDetailFactoryBean jobDetail = new MethodInvokingJobDetailFactoryBean(); jobDetail.setTargetObject(myTask); jobDetail.setTargetMethod("performAction"); jobDetail.setName("MyJobDetail"); jobDetail.setConcurrent(false); jobDetail.afterPropertiesSet(); /* SimpleTriggerBean trigger = new SimpleTriggerBean(); trigger.setBeanName("MyTrigger"); trigger.setJobDetail((JobDetail) jobDetail.getObject()); trigger.setRepeatInterval(5000); trigger.afterPropertiesSet(); */ // create CRON Trigger CronTriggerBean cronTrigger = new CronTriggerBean(); cronTrigger.setBeanName("CRON0001"); // Execute after each 5 second String expression = "5 * * * * ?"; cronTrigger.setCronExpression(expression); cronTrigger.afterPropertiesSet(); //scheduler.scheduleJob(jobDetail, cronTrigger); scheduler.scheduleJob((JobDetail) jobDetail.getObject(), cronTrigger); // Start Scheduler scheduler.start(); } catch (Exception e) { e.printStackTrace(); } } }


Spring 4 me permite hacer esto sin ningún problema (Quartz 2.0) - spring-dispatcher-servlet.xml

<task:annotation-driven executor="myExecutor" scheduler="myScheduler"/> <task:scheduler id="myScheduler" pool-size="10"/> <task:executor id="myExecutor" pool-size="1"/>

Inyectar el bean creado en el bean Spring o en la clase de servicio.

@Service public class DynamicJobExample { @Autowired @Qualifier("myScheduler") private TaskScheduler scheduler; public void schedule() throws ParseException { scheduler.schedule(new MyTask(), new CronTrigger("5 * * * * ?")); } }

MyTask debería ser una clase ejecutable

public class MyTask implements Runnable{ @Override public void run() { System.out.println("Hey, you reached me...:)"); } }

Las dependencias de Maven son (pom.xml)

<spring.version>4.1.0.RELEASE</spring.version> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.2.1</version> </dependency>


También puede crear los objetos JobDetail y Trigger de esta manera:

JobDetail jobDetail; String myJobClass = "com.MyJobClass"; String myJobName = "myJobName"; String myJobGroup ="myJobGroup"; Class myJobClassType= Class.forName(myJobClass); jobDetail =JobBuilder.newJob().ofType(myJobClassType) .withIdentity(myJobName, myJobGroup).build(); String myGroup = "myGroup"; String name = "TriggerName"; String expresion = "5 * * * * ?"; Trigger trigger = TriggerBuilder .newTrigger() .withIdentity(name, myGroup) .withSchedule( CronScheduleBuilder.cronSchedule(expresion)) .build();


package com.myproject; import java.text.ParseException; import org.quartz.JobBuilder; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.SchedulerFactory; import org.quartz.impl.triggers.CronTriggerImpl; import org.springframework.stereotype.Component; @Component public class QuartzSchedulerExample { public QuartzSchedulerExample() { SchedulerFactory schedFact = new org.quartz.impl.StdSchedulerFactory(); Scheduler scheduler; try { scheduler = schedFact.getScheduler(); JobDetail details = JobBuilder.newJob(MyMailBean.class) .withDescription("something") .withIdentity("mejob","myGroup") .storeDurably(true).build(); CronTriggerImpl trigger = new CronTriggerImpl(); trigger.setName("T1"); try { trigger.setCronExpression("0 0 0 * * ? *"); } catch (ParseException e) { e.printStackTrace(); } trigger.setDescription("desc"); scheduler.scheduleJob(details,trigger); scheduler.start(); } catch (SchedulerException e) { e.printStackTrace(); } } }

El trabajo se ejecutará todos los días 00:00:00 (hora: minuto: segundo)