需要架包quartz-2.2.1.jar
Class类:创建任务
import java.util.Calendar;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class MyJob implements Job {
@Override
public void execute(JobExecutionContext arg0) throws JobExecutionException {
System.out.println("任务正在执行,执行时间: " + Calendar.getInstance().getTime());
}
}
在Job接口实现类里面,添加需要的逻辑到execute()方法中。配置好Job实现类并设定好调度时间表,Quartz就会自动在设定的时间调度作业执行execute()。
测试代码
package quartz;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.quartz.CalendarIntervalScheduleBuilder;
import org.quartz.CalendarIntervalTrigger;
import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.DailyTimeIntervalScheduleBuilder;
import org.quartz.DailyTimeIntervalTrigger;
import org.quartz.DateBuilder;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.SimpleTrigger;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
public class QuartzTest {
public static void main(String[] args) {
try {
//获取一个调度工厂
SchedulerFactory schedFact = new StdSchedulerFactory();
// 从工厂里面拿到一个sched实例
Scheduler sched = schedFact.getScheduler();
// 真正执行的任务并不是Job接口的实例,而是用反射的方式实例化的一个JobDetail实例
JobDetail job = JobBuilder.newJob(MyJob.class)
// 根据name和默认的group(即"DEFAULT_GROUP")创建trigger的key
.withIdentity("job1", "group1")
//创建触发器
.build();
//SimpleTrigger-简单触发器
Date startTime = DateBuilder.nextGivenSecondDate(new Date( ),15); // 在当前时间15秒后运行
// 创建一个SimpleTrigger实例,指定该Trigger在Scheduler中所属组及名称。
// 接着设置调度的时间规则.当前时间15秒后运行,每10秒运行一次,共运行15次
// SimpleTrigger trigger = (SimpleTrigger) TriggerBuilder.newTrigger().withIdentity("trigger1", "group1")
// .startAt(startTime).withSchedule(SimpleScheduleBuilder.simpleSchedule()
// .withIntervalInSeconds(10)
// .withRepeatCount(15)
// ).build();
//CronTriger-Cron触发器
// // 每两秒执行
CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1").withSchedule(
CronScheduleBuilder.cronSchedule("/2 * * * * ?")
).build();
//日期触发
// // 每一分钟执行
// DailyTimeIntervalTrigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1").withSchedule(
// DailyTimeIntervalScheduleBuilder.dailyTimeIntervalSchedule().withInterval(1, DateBuilder.IntervalUnit.MINUTE)
// ).build();
//日历触发
// 每两秒执行
// CalendarIntervalTrigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1").withSchedule(
// CalendarIntervalScheduleBuilder.calendarIntervalSchedule().withInterval(2, DateBuilder.IntervalUnit.SECOND)
// ).build();
sched.scheduleJob(job, trigger);
// 调度启动
sched.start();
// Thread.sleep(2000);//不加这一句,会在sched触发时即shutdown,而不是job执行完shutdown
// sched.shutdown(true); //
} catch (Exception e) {
e.printStackTrace();
}
}
}
使用CronTrigger主要的是要掌握Cron表达式。Cron表达式包含6个必要组件和一个可选组件
例:/2 * * * * ? 每两秒执行一次
第1位: 秒(0~59) 字符表达(, - * /)
第2位: 分(0~59) 字符表达(, - * /)
第3位: 小时(0~24) 字符表达(, - * /)
第4位: 日期(1~31) 字符表达(, - * / ? L W C)
第5位: 月(JAN~DEC或1~12) 字符表达(, - * /)
第6位: 星期(SUN~SAT或1~7) 字符表达(, - * / ? L C #)
第7位: 年(可选,1970~2099),若为空,表示全部时间范围 字符表达(, - * /)
字符表达说明如下:
*:通配符,任意值
?:无特定值。通常和其他指定的值一起使用,表示必须显示该值但不能检查
-:范围。e.g.小时部分10-12表示10:00,11:00, 12:00
,:列分隔符。可以让你指定一系列的值。e.g.在星期域中指定MON、TUE和WED
/:增量。表示一个值的增量,e.g.分钟域中0/1表示从0开始,每次增加1min
L:表示Last。它在日期和星期域中表示有所不同。在日期域中,表示这个月的最后一天,而在星期域中,它永远是7(星期六)。当你希望使用星期中某一天时,L字符非常有用。e.g.星期域中6L表示每一个月的最后一个星期五
W:在本月内离当天最近的工作日触发,所谓的最近工作日,即当天到工作日的前后最短距离,如果当天即为工作日,则距离是0;所谓本月内指的是不能跨月取到最近工作日,即使前/后月份的最后一天/第一天确实满足最近工作日。e.g. LW表示本月的最后一个工作日触发,W强烈依赖月份。
#:表示该月的第几个星期,e.g. 1#2表示每一个月的第一个星期一
C:日历值。日期值是根据一个给定的日历计算出来的。在日期域中给定一个20C将在20日(日历包括20日)或20日后日历中包含的第一天(不包括20日)激活触发器。例如在一个星期域中使用6C表示日历中星期五(日历包括星期五)或者第一天(日历不包括星期五)
表达式列举:
"30 * * * * ?" 每半分钟触发任务
"30 10 * * * ?" 每小时的10分30秒触发任务
"30 10 1 * * ?" 每天1点10分30秒触发任务
"30 10 1 20 * ?" 每月20号1点10分30秒触发任务
"30 10 1 20 10 ? *" 每年10月20号1点10分30秒触发任务
"30 10 1 20 10 ? 2011" 2011年10月20号1点10分30秒触发任务
"30 10 1 ? 10 * 2011" 2011年10月每天1点10分30秒触发任务
"30 10 1 ? 10 SUN 2011" 2011年10月每周日1点10分30秒触发任务
"15,30,45 * * * * ?" 每15秒,30秒,45秒时触发任务
"15-45 * * * * ?" 15到45秒内,每秒都触发任务
"15/5 * * * * ?" 每分钟的每15秒开始触发,每隔5秒触发一次
"15-30/5 * * * * ?" 每分钟的15秒到30秒之间开始触发,每隔5秒触发一次
"0 0/3 * * * ?" 每小时的第0分0秒开始,每三分钟触发一次
"0 15 10 ? * MON-FRI" 星期一到星期五的10点15分0秒触发任务
"0 15 10 L * ?" 每个月最后一天的10点15分0秒触发任务
"0 15 10 LW * ?" 每个月最后一个工作日的10点15分0秒触发任务
"0 15 10 ? * 5L" 每个月最后一个星期四的10点15分0秒触发任务
"0 15 10 ? * 5#3" 每个月第三周的星期四的10点15分0秒触发任务