Ordonnanceur de tâches sous JAVA avec Spring
Usage de la librairie Quartz (anciennement de chez Opensymphony)
Site officiel : quartz-scheduler.org
Ajouter la librairie dans le pom.xml du projet:
<dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>1.8.4</version> </dependency>
création du fichier quartz-context.xml :
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="jobCronTrigger"/> <ref bean="jobCronSimpleTrigger"/> </list> </property> </bean> <bean id="jobCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail"> <ref local="myJob"/> </property> <!-- fires every day at 11:00 PM --> <property name="cronExpression" value="0 0 23 ? * *"/> </bean> <bean id="myJob" class="org.springframework.scheduling.quartz.JobDetailBean"> <property name="jobClass" value="com.gwadanina.job.MyJob"/> <property name="description" value="This my job"/> <property name="jobDataAsMap"> <map> <entry key="timeout" value="5"/> </map> </property> </bean> <bean id="jobCronSimpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean"> <property name="jobDetail" ref="mySimpleTriggerJob" /> <property name="repeatInterval" value="300000" /> <property name="startDelay" value="1000" /> </bean> <bean id="mySimpleTriggerJob" class="org.springframework.scheduling.quartz.JobDetailBean"> <property name="jobClass" value="com.gwadanina.job.MySimpleJob"/> <property name="description" value="This Simple job"/> <property name="jobDataAsMap"> <map> <entry key="timeout" value="5"/> </map> </property> </bean> </beans>
code Java :
package com.gwadanina.job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.springframework.scheduling.quartz.QuartzJobBean; import org.springframework.stereotype.Component; /** * */ @Component public class MyJob extends QuartzJobBean { /** * Logger. */ private static Logger log = LoggerFactory.getLogger(MyJob.class); /** * @param context * * @throws JobExecutionException */ @Override protected void executeInternal(JobExecutionContext context) throws JobExecutionException { log.info("do the job ..."); } }
code Java Simple :
package com.gwadanina.job; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.springframework.stereotype.Component; /** * */ @Component public class MySimpleJob implements Job { /** * Logger. */ private static Logger log = LoggerFactory.getLogger(MySimpleJob.class); @Override public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { log.info("do the job ..."); } }
Liste des jobs chargés par Spring au lancement de l'application:
package com.gwadanina.job; import com.gwadanina.spring.ApplicationContextHolder; import org.quartz.JobDetail; import org.quartz.JobExecutionContext; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.Trigger; import org.springframework.scheduling.quartz.SchedulerFactoryBean; import java.util.Date; import java.util.Iterator; import java.util.List; public class ListeDesJobs { /** * logger */ static Logger log = LoggerFactory.getLogger(ListeDesJobs.class); public static void main(String[] args) throws SchedulerException { Scheduler scheduler = ApplicationContextHolder.getBean(SchedulerFactoryBean.class).getScheduler(); String[] jobGroupNames = scheduler.getJobGroupNames(); for (int idGroup = 0; idGroup < jobGroupNames.length; idGroup++) { String jobGroupName = jobGroupNames[idGroup]; String[] jobNames = scheduler.getJobNames(jobGroupName); for (int idxJob = 0; idxJob < jobNames.length; idxJob++) { StringBuffer informations = new StringBuffer(); String jobName = jobNames[idxJob]; JobDetail jobDetail = scheduler.getJobDetail(jobName, jobGroupName); Trigger[] triggersOfJob = scheduler.getTriggersOfJob(jobName, jobGroupName); informations.append("jobGroupName : " + jobGroupName); informations.append(", jobName : " + jobName); informations.append(", description : " + jobDetail.getDescription()); List jobExecutionContexts = scheduler.getCurrentlyExecutingJobs(); for (int trigger = 0; trigger < triggersOfJob.length; trigger++) { Trigger aTrigger = triggersOfJob[trigger]; Date nextFireTime = aTrigger.getNextFireTime(); informations.append(", nextFireTime : " + nextFireTime); } for (Iterator iterator = jobExecutionContexts.iterator(); iterator.hasNext(); ) { JobExecutionContext jobContext = (JobExecutionContext) iterator.next(); if (jobContext.getJobDetail() == jobDetail) { informations.append(", En cours d'execution..."); } } log.info(informations.toString()); } } } }
Afin de lancer le job onDemande exécutez la commande suivante:
Scheduler scheduler = ApplicationContextHolder.getBean(SchedulerFactoryBean.class).getScheduler(); try { scheduler.triggerJobWithVolatileTrigger(jobName, jobGroupName); } catch (SchedulerException e) { throw new SystemException(e); }