上一章讲了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 表达式)来讲解.
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/china_shrimp/article/details/52138355
内容来源于网络,如有侵权,请联系作者删除!