您的位置:首页 > 其它

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

2016-08-06 21:08 411 查看
上一章讲了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 表达式)来讲解.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息