Comment déclencher un travail Quartz manuellement (exemple JSF 2)

Comment déclencher une tâche Quartz manuellement (exemple JSF 2)

Dans Quartz, vous pouvez déclencher une tâche manuellement via le modèle suivant:

JobKey jobKey = new JobKey(jobName, jobGroup);
scheduler.triggerJob(jobKey); //trigger a job by jobkey

Dans ce didacticiel, nous allons vous montrer une application Web JSF 2, afficher tous les travaux Quartz surdataTable et permettre à l'utilisateur de cliquer sur un lien pour lancer le travail manuellement.

Outil utilisé:

  1. JSF 2.1.11

  2. Quartz 2.1.5

  3. Eclipse 4.2

  4. Maven 3

  5. Testé sur Tomcat 6 et 7

1. Répertoire des projets

Répertoire final du projet.

final project directory

2. Dépendance du projet

Toutes les dépendances de ce tutoriel.

Fichier: pom.xml



        
            com.sun.faces
            jsf-api
            2.1.11
        
        
            com.sun.faces
            jsf-impl
            2.1.11
        

        
            javax.servlet
            jstl
            1.2
        

        
            javax.servlet
            servlet-api
            2.5
        

        
            javax.servlet.jsp
            jsp-api
            2.1
        

        
        
            org.glassfish.web
            el-impl
            2.2
        

        
            com.sun.el
            el-ri
            1.0
        

        
        
            org.quartz-scheduler
            quartz
            2.1.5
        

        
            javax.transaction
            jta
            1.1
        

    

3. Emplois Quartz

Créez deux Jobs et intégrez-les à JSF, via un écouteur dansweb.xml.

package com.example.jobs;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class JobA implements Job {

    @Override
    public void execute(JobExecutionContext context)
        throws JobExecutionException {
        System.out.println("Job A is runing");

    }

}
package com.example.jobs;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class JobB implements Job {

    @Override
    public void execute(JobExecutionContext context)
        throws JobExecutionException {
        System.out.println("Job B is runing");

    }

}

Fichier: quartz.properties

org.quartz.scheduler.instanceName = MyScheduler
org.quartz.threadPool.threadCount = 3
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
org.quartz.plugin.jobInitializer.class =org.quartz.plugins.xml.XMLSchedulingDataProcessorPlugin
org.quartz.plugin.jobInitializer.fileNames = quartz-config.xml
org.quartz.plugin.jobInitializer.failOnFileNotFound = true

Fichier: quartz.config



    
        
            JobA
            GroupDummy
            This is Job A
            com.example.jobs.JobA
        

        
            
                dummyTriggerNameA
                JobA
                GroupDummy
                
                0/30 * * * * ?
            
        
    

    
        
            JobB
            GroupDummy
            This is Job B
            com.example.jobs.JobB
        

        
            
                dummyTriggerNameB
                JobB
                GroupDummy
                
                0/30 * * * * ?
            
        
    

Fichier: web.xml



    JavaServerFaces

    
    
        javax.faces.PROJECT_STAGE
        Development
    

    
    
        faces/welcome.xhtml
    

    
    
        Faces Servlet
        javax.faces.webapp.FacesServlet
        1
    

    
    
        Faces Servlet
        /faces/*
    
    
        Faces Servlet
        *.jsf
    
    
        Faces Servlet
        *.faces
    
    
        Faces Servlet
        *.xhtml
    

    
        
            org.quartz.ee.servlet.QuartzInitializerListener
        
    

4. JSF Bean

Un bean JSF pour fournir des données pourdataTable plus tard. Dans le constructeur, récupérez tous les travaux existants et ajoutez-les à une liste, puis renvoyez-le.

package com.example.scheduler;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.servlet.ServletContext;

import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.ee.servlet.QuartzInitializerListener;
import org.quartz.impl.StdSchedulerFactory;
import org.quartz.impl.matchers.GroupMatcher;

@ManagedBean(name = "scheduler")
@SessionScoped
public class SchedulerBean implements Serializable {

    private static final long serialVersionUID = 1L;

    private Scheduler scheduler;

    private List quartzJobList = new ArrayList();

    public SchedulerBean() throws SchedulerException {

      ServletContext servletContext = (ServletContext) FacesContext
        .getCurrentInstance().getExternalContext().getContext();

      //Get QuartzInitializerListener
      StdSchedulerFactory stdSchedulerFactory = (StdSchedulerFactory) servletContext
        .getAttribute(QuartzInitializerListener.QUARTZ_FACTORY_KEY);

      scheduler = stdSchedulerFactory.getScheduler();

      // loop jobs by group
      for (String groupName : scheduler.getJobGroupNames()) {

        // get jobkey
        for (JobKey jobKey : scheduler.getJobKeys(GroupMatcher
            .jobGroupEquals(groupName))) {

            String jobName = jobKey.getName();
            String jobGroup = jobKey.getGroup();

            // get job's trigger
            List triggers = (List) scheduler
                .getTriggersOfJob(jobKey);
            Date nextFireTime = triggers.get(0).getNextFireTime();

            quartzJobList.add(new QuartzJob(jobName, jobGroup, nextFireTime));

        }

      }

    }

    //trigger a job
    public void fireNow(String jobName, String jobGroup)
        throws SchedulerException {

        JobKey jobKey = new JobKey(jobName, jobGroup);
        scheduler.triggerJob(jobKey);

    }

    public List getQuartzJobList() {

        return quartzJobList;

    }

    public static class QuartzJob {

        private static final long serialVersionUID = 1L;

        String jobName;
        String jobGroup;
        Date nextFireTime;

        public QuartzJob(String jobName, String jobGroup, Date nextFireTime) {

            this.jobName = jobName;
            this.jobGroup = jobGroup;
            this.nextFireTime = nextFireTime;
        }

        public String getJobName() {
            return jobName;
        }

        public void setJobName(String jobName) {
            this.jobName = jobName;
        }

        public String getJobGroup() {
            return jobGroup;
        }

        public void setJobGroup(String jobGroup) {
            this.jobGroup = jobGroup;
        }

        public Date getNextFireTime() {
            return nextFireTime;
        }

        public void setNextFireTime(Date nextFireTime) {
            this.nextFireTime = nextFireTime;
        }

    }

}

5. Pages JSF

Une page Web, récupérez toutes les tâches existantes via EL#{scheduler.quartzJobList} et affichez-la via le composantdataTable. Lorsque le lien «fireNow» est cliqué, il déclenche immédiatement le travail spécifié.

Fichier: welcome.xhtml




    



  

All Quartz Jobs

Job Name #{quartz.jobName} Job Group #{quartz.jobGroup} Next Fire Time Action

Fichier: table-style.css

.quartz-table{
    border-collapse:collapse;
}

.quartz-table-header{
    text-align:center;
    background:none repeat scroll 0 0 #E5E5E5;
    border-bottom:1px solid #BBBBBB;
    padding:16px;
}

.quartz-table-odd-row{
    text-align:center;
    background:none repeat scroll 0 0 #FFFFFFF;
    border-top:1px solid #BBBBBB;
    padding:20px;
}

.quartz-table-even-row{
    text-align:center;
    background:none repeat scroll 0 0 #F9F9F9;
    border-top:1px solid #BBBBBB;
    padding:20px;
}

6. Demo

Voir le résultat final. http://localhost:8080/JavaServerFaces/

list all quartz jobs

Télécharger le code source

Téléchargez-le -JSF-Quartz-Trigger-Job-Manually.zip (28 ko)