framework:quartz-scheduler

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);
            }
  • framework/quartz-scheduler.txt
  • Dernière modification: 2018/10/13 14:59
  • (modification externe)