Quartzジョブを手動で起動する方法(JSF 2の例)

Quartzジョブを手動でトリガーする方法(JSF 2の例)

Quartzでは、次のパターンを使用して手動でジョブをトリガーできます。

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

このチュートリアルでは、JSF 2 Webアプリケーションを示し、すべてのQuartzジョブをdataTableに表示し、ユーザーがリンクをクリックしてジョブを手動で実行できるようにします。

使用ツール:

  1. JSF 2.1.11

  2. クォーツ2.1.5

  3. Eclipse 4.2

  4. メーベン3

  5. Tomcat 6および7でテスト済み

1. プロジェクトディレクトリ

最終プロジェクトディレクトリ。

final project directory

2. プロジェクトの依存関係

このチュートリアルのすべての依存関係。

ファイル: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. クォーツジョブズ

2つのジョブを作成し、web.xmlのリスナーを介してJSFと統合します。

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");

    }

}

ファイル: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

ファイル: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 * * * * ?
            
        
    

ファイル: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

後でdataTableのデータを提供するJSFBean。 コンストラクターで、既存のすべてのジョブを取得してリストに追加し、それを返します。

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. JSFページ

Webページで、EL#{scheduler.quartzJobList}を介して既存のすべてのジョブを取得し、dataTableコンポーネントを介して表示します。 「fireNow」リンクをクリックすると、指定されたジョブがすぐに実行されます。

ファイル:welcome.xhtml




    



  

All Quartz Jobs

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

ファイル: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

最終出力を参照してください。 http://localhost:8080/JavaServerFaces/

list all quartz jobs

ソースコードをダウンロード

ダウンロード–JSF-Quartz-Trigger-Job-Manually.zip(28 kb)