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, 孙悟空. 齐天大圣
...

 

转载于:https://www.cnblogs.com/eaglediao/p/6901733.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值