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

上一章讲了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("------------------------");
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

  使用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();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55

运行结果(只运行了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("------------------------");
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

  使用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();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50

运行结果 
这里写图片描述

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值