简述:
这里研究一下Quartz调度工具,Trigger的使用
主要是用simpleschedule 和 cronschedule
参考
http://www.quartz-scheduler.org/documentation/quartz-2.2.x/tutorials/tutorial-lesson-04
http://www.quartz-scheduler.org/documentation/quartz-2.2.x/tutorials/tutorial-lesson-05
http://www.quartz-scheduler.org/documentation/quartz-2.2.x/tutorials/tutorial-lesson-06
1. simpleSchedule
设置启动时间,之后每五秒输出一次
TestQuartz.java
package com.anialy.tq;
import static org.quartz.DateBuilder.dateOf;
import static org.quartz.JobBuilder.newJob;
import static org.quartz.SimpleScheduleBuilder.simpleSchedule;
import static org.quartz.TriggerBuilder.newTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.impl.StdSchedulerFactory;
public class TestQuartz {
private static Scheduler scheduler;
public static void main(String[] args) {
try {
// Grab the Scheduler instance from the Factory
scheduler = StdSchedulerFactory.getDefaultScheduler();
// Set Scheduler
setScheduler();
// and start it off
scheduler.start();
//shutdown to see the output of TestJob
// scheduler.shutdown();
} catch (SchedulerException se) {
se.printStackTrace();
}
}
private static void setScheduler(){
// define the job and tie it to our HelloJob class
JobDetail job = newJob(TestJob.class)
.withIdentity("job1", "group1")
.build();
// Trigger the job with interval 5 seconds
Trigger trigger1 = newTrigger()
.withIdentity("trigger2", "group1")
.startAt(dateOf(22, 03, 59)) //start time 22:03:59
// .endAt(dateOf(22, 04, 59)) //end time 22:04:59
.withSchedule(simpleSchedule()
.withIntervalInSeconds(5)
.repeatForever())
.build();
// Tell quartz to schedule the job using our trigger
try {
scheduler.scheduleJob(job, trigger1);
} catch (SchedulerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
TestJob.java 输出的任务
package com.anialy.tq;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class TestJob implements Job {
private static int cnt = 0;
public TestJob() {
// Instances of Job must have a public no-argument constructor.
}
@Override
public void execute(JobExecutionContext arg0) throws JobExecutionException {
// TODO Auto-generated method stub
System.out.println("TestJob " + (++cnt) + " Run! ");
System.out.println("Current Time: "
+ new SimpleDateFormat("yyyy:MM:dd HH:mm:ss").format(new Date()));
}
}
输出:
2. cronSchedule
或者使用cronschedule实现任务Trigger配置,注意在cronschedule之中比如8月1号已设置,但是周几是不固定的 那就用“?”在周几的位置占位
package com.anialy.tq;
import static org.quartz.DateBuilder.dateOf;
import static org.quartz.JobBuilder.newJob;
import static org.quartz.SimpleScheduleBuilder.simpleSchedule;
import static org.quartz.TriggerBuilder.newTrigger;
import org.quartz.Calendar;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.impl.StdSchedulerFactory;
import static org.quartz.TriggerBuilder.*;
import static org.quartz.CronScheduleBuilder.*;
import static org.quartz.DateBuilder.*;
public class TestQuartz {
private static Scheduler scheduler;
public static void main(String[] args) {
try {
// Grab the Scheduler instance from the Factory
scheduler = StdSchedulerFactory.getDefaultScheduler();
// Set Scheduler
setScheduler();
// and start it off
scheduler.start();
//shutdown to see the output of TestJob
// scheduler.shutdown();
} catch (SchedulerException se) {
se.printStackTrace();
}
}
private static void setScheduler(){
// define the job and tie it to our HelloJob class
JobDetail job = newJob(TestJob.class)
.withIdentity("job1", "group1")
.build();
/**
* DayOfMonth : 1-31
* Month : JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV and DEC
* DayOfWeek : 1 and 7 (1 = Sunday) or SUN, MON, TUE, WED, THU, FRI and SAT
* or use MON-FRI to declare weekdays
*/
Trigger trigger1 = newTrigger()
.withIdentity("trigger2", "group1")
//Aug 1st 10pm - 11pm every 1 minute
.withSchedule(cronSchedule("0 0/1 22-23 1 Aug ?"))
// //10pm - 11pm every 1 minute on every Thursday and Friday in August
// .withSchedule(cronSchedule("0 0/1 22-23 ? Aug Thu,Friday"))
.build();
// Tell quartz to schedule the job using our trigger
try {
scheduler.scheduleJob(job, trigger1);
} catch (SchedulerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
附,基本的正则表达式含义
(1)
"0/10 15/1 23-00 1 Aug ?"
表示从8月1号,23:15:00到00::00:00 截止开始每隔10秒执行一次
(2)
"0 0/1 22-23 ? AUG THU,FRI"
表示八月份的周四、周五每天晚上从22:42:00到23::00:00 截止,每分钟执行一次