quartz任务调度基础: Job/Trigger/Schedule

1、Quartz基本用法

       参见官方说明:[Quartz Job Scheduler]

      三大核心元素:

  •       Job:定义要执行的任务
  •       triggers:任务触发策略
  •       scheduler:关联job和trigger

1.1  调度器scheduler

      scheduler的初始化和启动 

  // 工厂方式创建调度器实例Scheduler
  Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
  ...
  scheduler.scheduleJob(job, trigger); //将任务与触发器关联起来
  // 启动,开始调度 
  scheduler.start();

 

1.2  任务Jobs

        实现Job,其中包含一个.execute()方法

  import org.quartz.Scheduler;
  import org.quartz.SchedulerException;
  import org.quartz.impl.StdSchedulerFactory;
  import static org.quartz.JobBuilder.*;
  import static org.quartz.TriggerBuilder.*;
  import static org.quartz.SimpleScheduleBuilder.*;

public class MyJob implements org.quartz.Job {

      public MyJob() {
      }
    
    // Quartz调度运行任务时,即执行execute()方法
public void execute(JobExecutionContext context) throws JobExecutionException { System.err.println("Hello World! MyJob is executing."); } }

1.3 触发器triggers

  通过trigger触发任务执行(triggers定义了job在什么时候运行。)

  // 定义job,并与MyJob绑定。
  JobDetail job = newJob(MyJob.class)
      .withIdentity("job1", "group1")
      .build();

  // Trigger 触发job立即执行,并每隔40s重复一次。
  Trigger trigger = newTrigger()
      .withIdentity("trigger1", "group1")
      .startNow()
      .withSchedule(simpleSchedule()
              .withIntervalInSeconds(40)
              .repeatForever())
      .build();

  // 调度器用于将任务与触发器关联起来。(任务和触发器可以是多对多的关系,)
  scheduler.scheduleJob(job, trigger);

 

2、 再举例

2.1 调度的任务JOB

(与上述Job类一致)

package com.mypractice.quartz;

import java.text.SimpleDateFormat;
import java.time.format.DateTimeFormatterBuilder;
import java.util.Date;

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

public class HelloJob  implements Job{

    public void execute(JobExecutionContext context) throws JobExecutionException {
        SimpleDateFormat time=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
        String dsc = context.getJobDetail().getDescription();
        String name = context.getJobDetail().getJobDataMap().getString("name");
        System.out.println(time.format(new java.util.Date()) +" hello, " + name + ". " + dsc + " ");
    }

}

 

 2.2 可以添加trigger的监听(实现TriggerListener接口)

trigger的配置在上一部分已做描述,此处是添加了触发器的监听。

以下示例中,在触发执行完后做了打印输出。

package com.mypractice.quartz;

import org.quartz.JobExecutionContext;
import org.quartz.Trigger;
import org.quartz.Trigger.CompletedExecutionInstruction;
import org.quartz.TriggerListener;

public class myJobTriggerListener implements TriggerListener {

    public String getName() {
        // TODO Auto-generated method stub
        return "user_defined_Trigger";
    }

    public void triggerFired(Trigger trigger, JobExecutionContext context) {
        // TODO Auto-generated method stub
        
    }

    public boolean vetoJobExecution(Trigger trigger, JobExecutionContext context) {
        // TODO Auto-generated method stub
        return false;
    }

    public void triggerMisfired(Trigger trigger) {
        // TODO Auto-generated method stub
        
    }

    public void triggerComplete(Trigger trigger, JobExecutionContext context,
            CompletedExecutionInstruction triggerInstructionCode) {
        String name = context.getJobDetail().getJobDataMap().getString("name");
        String dsc = context.getJobDetail().getDescription();
        System.out.println("compelte " + name  + " " +dsc);
    }
}

 

2.3 整体测试代码

package com.mypractice.quartz;

import org.quartz.CronScheduleBuilder;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.JobListener;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;

public class TestQuartzMain {

    public static void main(String[] args) throws SchedulerException {
        //scheduler
        SchedulerFactory schedulerFactory = new StdSchedulerFactory();
        Scheduler sch = schedulerFactory.getScheduler();
        
        //1. Job 
        //JobDetail jobDetail =  new JobDetail("jobDetail-s1", "jobDetailGroup-s1", HelloJob.class); 
        //(qurtz1.*版本之前是以上用法)
JobDetail jobDetail = JobBuilder.newJob(HelloJob.class) .withIdentity("helloJob", "groupJob")//given name and group to identify the JobDetail. .usingJobData("name", "孙悟空")//Add the given key-value pair to the JobDetail's .withDescription("齐天大圣") .build(); //2. trigger Trigger trigger1 = TriggerBuilder.newTrigger() .withIdentity("cron trigger", "groupTrigger") .withSchedule( //每5秒执行一次 CronScheduleBuilder.cronSchedule("0/5 * * ? * *") ).build(); // (附加) 加入triggerlistener。 sch.getListenerManager().addTriggerListener(new myJobTriggerListener()); //3. 把job、trigger注册到任务调度中 sch.scheduleJob(jobDetail, trigger1); //4. 启动调度 sch.start(); } }

 

输出

2017-05-25 01:05:00 hello, 孙悟空. 齐天大圣 
compelte 孙悟空 齐天大圣
2017-05-25 01:05:05 hello, 孙悟空. 齐天大圣 
compelte 孙悟空 齐天大圣
2017-05-25 01:05:10 hello, 孙悟空. 齐天大圣
...

 

posted @ 2017-05-25 00:44  eaglediao  阅读(3277)  评论(0编辑  收藏  举报