转载请出自出处:http://eksliang.iteye.com/blog/2208166
一.概述
SimpleTrigger触发器,当且仅需触发一次或者以固定时间间隔周期触发执行;
二.SimpleTrigger的构造函数
- SimpleTrigger(String name, String group):通过该构造函数指定Trigger所属组和名称;
- SimpleTrigger(String name, String group, Date startTime):除指定Trigger所属组和名称外,还可以指定触发的开发时间;
- SimpleTrigger(String name, String group, Date startTime, Date endTime, int repeatCount, long repeatInterval):除指定以上信息外,还可以指定结束时间、重复执行次数、时间间隔等参数;
- SimpleTrigger(String name, String group, String jobName, String jobGroup, Date startTime, Date endTime, int repeatCount, long repeatInterval):这是最复杂的一个构造函数,在指定触发参数的同时,还通过jobGroup和jobName,让该Trigger和Scheduler中的某个任务关联起来。
三.参考实例
简单的Job实现类:打印任务详情
package com.ickes.job;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
/**
* 实现Job接口,定义运行的任务
* @author Ickes
*/
public class SimpleJob implements Job {
public void execute(JobExecutionContext context)
throws JobExecutionException {
//打印任务详情
System.out.println(
context.getJobDetail().getGroup()
+"——"+context.getJobDetail().getName()
+"——"+context.getTrigger().getName()
+"——"+context.getTrigger().getGroup());
}
}
使用SimpleTrigger进行调度(实例一)
package com.ickes.job;
import java.util.Date;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleTrigger;
import org.quartz.impl.StdSchedulerFactory;
/**
* @author Ickes
*/
public class SimpleTriggerDemo {
public static void main(String[] args) throws Exception {
//第一步:创建一个JobDetail实例
JobDetail jobDetail = new JobDetail("j_job1","j_group1", SimpleJob.class);
//第二步:通过SimpleTrigger触发器定义调度规则:马上启动,每2秒运行一次,共运行100次
SimpleTrigger simpleTrigger = new SimpleTrigger("t_job1","t_group_1");
simpleTrigger.setStartTime(new Date());//开始运行时间
simpleTrigger.setRepeatInterval(2000); //运行间隔单位为毫秒
simpleTrigger.setRepeatCount(100); //运行次数
//第三步:通过SchedulerFactory获取一个调度器实例
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
//第四步:将job跟trigger注册到scheduler中进行调度
scheduler.scheduleJob(jobDetail, simpleTrigger);
//第五步:调度启动
scheduler.start();
}
}
上面代码也可以通过SimpleTrigger的setStartTime(java.util.Date startTime)和setEndTime(java.util.Date endTime)指定运行的时间范围,当运行次数和时间范围冲突时,超过时间范围的任务运行不被执行。如可以通过simpleTrigger.setStartTime(new Date(System.currentTimeMillis() + 60000L))指定60秒钟以后开始。
使用SimpleTrigger进行调度(实例二)
package com.ickes.job;
import java.util.Date;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleTrigger;
import org.quartz.impl.StdSchedulerFactory;
/**
* @author Ickes
*/
public class SimpleTriggerDemo1 {
public static void main(String[] args) throws Exception {
//第一步:创建一个JobDetail实例
JobDetail jobDetail = new JobDetail("j_job1","j_group1", SimpleJob.class);
SimpleTrigger simpleTrigger = new SimpleTrigger("trigger1_1","tgroup1");
simpleTrigger.setStartTime(new Date());//开始运行时间
simpleTrigger.setRepeatInterval(2000); //运行间隔单位为毫秒
simpleTrigger.setRepeatCount(100); //运行次数
simpleTrigger.setJobGroup("j_group1");
simpleTrigger.setJobName("j_job1");
//第三步:通过SchedulerFactory获取一个调度器实例
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
//第四步:将job跟trigger注册到scheduler中进行调度
scheduler.addJob(jobDetail, true);
scheduler.scheduleJob(simpleTrigger);
//第五步:调度启动
scheduler.start();
}
}
实例一与实例二的区别很明显:注册job跟trigger到scheduler中的方式不同
四.TriggerUtils工具类
在构造Trigger实例时, 可以考虑使用org.quartz.TriggerUtils工具类,该工具类不但提供了众多获取特定时间的方法,还拥有众多获取常见Trigger的方法。
参考实例如下
package com.ickes.job;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.quartz.TriggerUtils;
/**
*
* @author Ickes
*
*/
public class TriggerUtilsDemo {
public static SimpleDateFormat fomat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
/**
* 方法太多,但是他的注释非常详细
* @param args
*/
public static void main(String[] args) {
//创建一个每秒执行一次的Trigger
TriggerUtils.makeSecondlyTrigger("t_name");
//创建一个每星期某一特定时间点执行一次的Trigger
TriggerUtils.makeWeeklyTrigger("t_name", 1, 1, 1);
//创建一个每5秒执行一次,总共执行10次的Trigger
TriggerUtils.makeSecondlyTrigger("t_name",5,10);
//获得时间的方法
println(TriggerUtils.getDateOf(0, 0, 0));
//返回下一个小时的时间,例如2015-05-04 11:20:00 返回2015-05-04 12:00:00
println(TriggerUtils.getEvenHourDate(new Date()));
}
public static void println(Date date){
System.out.println(fomat.format(date));
}
}