Quartz(02) 两种Trigger(SimpleTrigger/CronTrigger)

x33g5p2x  于2021-12-21 转载在 其他  
字(5.1k)|赞(0)|评价(0)|浏览(353)

上一章讲了Quartz 的几个核心概念(上一章节地址Quartz快速入门).接下来看看Quartz的两种Trigger. SimpleTrigger/CronTrigger. 简单的定时任务,可以采用SimpleTrigger,复杂的任务一般采用CronTrigger.

源码下载地址

1.SimpleTrigger
  SimpleTrigger是Quartz中最简单Trigger.它是为那种需要在特定的日期/时间启动,且以一个可能的间隔时间重复执行 n 次的 Job 所设计的。下面有一个例子,每5秒钟执行一次,一共执行4次的任务.

  实现了com.quartz.job接口的类

package com.quartz.job;

import java.text.SimpleDateFormat;
import java.util.Date;

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

//实现了job接口的Q1 job
public class Q1 implements Job {

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        System.out.println("------------------------");
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd hh:mm:ss");
        System.out.println(sdf.format(new Date()));
        // 获取jobDetail 中的参数
        JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
        String para1 = jobDataMap.getString("para1");
        System.out.println("jobDataMap中的para1:" + para1);
        System.out.println("------------------------");
    }

}

使用SimpleTrigger

package com.quartz.test;

import org.quartz.JobBuilder;
import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;

import com.quartz.job.Q1;

/** * 1.一个Job可以对应 多个Trigger,但一个Trigger只能对应一个Job * * 2.一个新的scheduler 或是处于standby状态的scheduler可以调用start方法 * * @author Administrator */
public class Listing_3_5 {
    public Listing_3_5() {
    }

    public Scheduler createScheduler() throws SchedulerException {
        return StdSchedulerFactory.getDefaultScheduler();
    }

    @SuppressWarnings("static-access")
    public void scheduleJob(Scheduler scheduler) throws SchedulerException {
        JobDetail jobDetail = JobBuilder.newJob(Q1.class).withIdentity("job1_1", "jGroup1").build();

        JobDataMap jobDataMap = jobDetail.getJobDataMap();

        jobDataMap.put("para1", "hello");

        // 一个scheduler 可以绑定多个job
        // 一个 Job 在同一个 Scheduler 实例中通过名称和组名能唯一被标识
        // 每5秒执行一次,共执行四次(注意参数为3)
        SimpleScheduleBuilder builder = SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(5)
                .withRepeatCount(3);
        Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger_1", "tGroup1").startNow()
                .withSchedule(builder).build();
        scheduler.scheduleJob(jobDetail, trigger);
    }

    public static void main(String[] args) throws Exception {
        Listing_3_5 example = new Listing_3_5();
        Scheduler scheduler = example.createScheduler();
        example.scheduleJob(scheduler);
        scheduler.start();
    }
}

运行结果(只运行了4次)

2.CronTrigger 不仅可以设定简单的触发时间表,更可以设定非常复杂的触发时间表。 CronTrigger 是基于 Unix类似于 cron 表达式,如果对cron表达式比较熟悉,那么 学习起来经非常简单. 即使对cron表达式不熟悉,花一会儿的功夫也可以学会. cron 表达式在下一章重点讲解,本章稍作了解.假定有一个任务需要在21:00-21:03每分钟运行一次,此时我们发现SimpleTrigger 已经不能满足这个需求了.这个就是CronTrigger 登场的时候了,满足这个需求的对应的cron表达式是 0 00-03 21 * * ? (读者暂时不必深究这个表达式).实现如下

  实现了com.quartz.job接口的类,

package com.quartz.job;

import java.text.SimpleDateFormat;
import java.util.Date;

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

//实现了job接口的Q1 job
public class Q1 implements Job {

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        System.out.println("------------------------");
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd hh:mm:ss");
        System.out.println(sdf.format(new Date()));
        // 获取jobDetail 中的参数
        JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
        String para1 = jobDataMap.getString("para1");
        System.out.println("jobDataMap中的para1:" + para1);
        System.out.println("------------------------");
    }

}

使用CronTrigger

package com.quartz.test;

import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.JobBuilder;
import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;

import com.quartz.job.Q1;

/** * 1.一个Job可以对应 多个Trigger,但一个Trigger只能对应一个Job * * 2.一个新的scheduler 或是处于standby状态的scheduler可以调用start方法 * * @author Administrator */
public class Listing_3_6 {
    public Listing_3_6() {
    }

    public Scheduler createScheduler() throws SchedulerException {
        return StdSchedulerFactory.getDefaultScheduler();
    }

    public void scheduleJob(Scheduler scheduler) throws SchedulerException {
        JobDetail jobDetail = JobBuilder.newJob(Q1.class).withIdentity("job1_1", "jGroup1").build();
        JobDataMap jobDataMap = jobDetail.getJobDataMap();
        jobDataMap.put("num", "123");

        // cronTrigger 创建
        // 21:00 - 21:03 每分钟执行一次
        CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("0 00-03 21 * * ?");
        CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity("trigger_1", "tGroup1")
                .withSchedule(cronScheduleBuilder).build();
        scheduler.scheduleJob(jobDetail, cronTrigger);
    }

    public static void main(String[] args) throws Exception {
        Listing_3_6 example = new Listing_3_6();
        Scheduler scheduler = example.createScheduler();
        example.scheduleJob(scheduler);
        scheduler.start();
    }
}

运行结果

到此,通过两个简单的小例子,实现了SimpleTrigger/CronTrigger 不同的用法.在项目的开发中往往采取CronTrigger 来开发,因为它更加强大. 本章最大的悬念就是CronTrigger 要使用的cron 表达式,将在下一章(cron 表达式)来讲解.

相关文章