認(rèn)識(shí)Trigger
Quartz中的觸發(fā)器是用來(lái)告訴調(diào)度程序作業(yè)什么時(shí)候觸發(fā)呈宇,即Trigger對(duì)象是用來(lái)觸發(fā)執(zhí)行Job的。
觸發(fā)器的通用屬性
JobKey:表示job實(shí)例的標(biāo)識(shí)笛洛,觸發(fā)器被觸發(fā)時(shí),該指定的job實(shí)例會(huì)執(zhí)行纷跛。
StartTime:表示觸發(fā)器的時(shí)間表首次觸發(fā)的時(shí)間扫夜,值為util.Date。
EndTime:指定觸發(fā)器的不再被觸發(fā)的時(shí)間炮捧,值為util.Date庶诡。
實(shí)例如下
HelloScheduler類中的startAt(date)和endAt(endDate)
public class HelloScheduler {
public static void main(String[] args) throws SchedulerException {
//打印當(dāng)前時(shí)間
Date date = new Date();
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("當(dāng)前時(shí)間為:"+sf.format(date));
// 創(chuàng)建一個(gè)JobDetail實(shí)例,將實(shí)例與HelloJob綁定
JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
.withIdentity("myJob", "ground1")
.build();
//獲取距離當(dāng)前時(shí)間3秒后的時(shí)間
date.setTime(date.getTime()+3000);
//獲取距離當(dāng)前時(shí)間6秒后的時(shí)間
Date endDate = new Date();
endDate.setTime(endDate.getTime()+6000);
// 創(chuàng)建一個(gè)Trigger實(shí)例咆课,定義該Job立即執(zhí)行末誓,并且每隔兩秒鐘重復(fù)執(zhí)行一次
Trigger trigger = TriggerBuilder
.newTrigger()
.withIdentity("myTrigger", "group1")
.startAt(date)//開始執(zhí)行時(shí)間為當(dāng)前時(shí)間的后3秒
.endAt(endDate)//停止執(zhí)行的時(shí)間為當(dāng)前時(shí)間的后6秒
.withSchedule(
SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(2).repeatForever())
.build();
//創(chuàng)建Schedule實(shí)例
SchedulerFactory sFactory = new StdSchedulerFactory();
Scheduler scheduler = sFactory.getScheduler();
scheduler.start();
scheduler.scheduleJob(jobDetail,trigger);
}
}
HelloJob中獲取了開始執(zhí)行時(shí)間和結(jié)束執(zhí)行時(shí)間扯俱。
public class HelloJob implements Job{
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
//打印當(dāng)前的執(zhí)行時(shí)間
Date date = new Date();
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("當(dāng)前時(shí)間為:"+sf.format(date));
Trigger currentTrigger = context.getTrigger();
System.out.println("開始時(shí)間為:"+currentTrigger.getStartTime());
System.out.println("結(jié)束時(shí)間為:"+currentTrigger.getEndTime());
JobKey jobKey = currentTrigger.getJobKey();
System.out.println("jobKeyName:"+jobKey.getName()+"jobGroup:"+jobKey.getGroup());
}
}
認(rèn)識(shí)SimpleTrigger
在一個(gè)指定時(shí)間段內(nèi)執(zhí)行一次作業(yè)任務(wù),或是在指定的時(shí)間間隔內(nèi)多次執(zhí)行作業(yè)任務(wù)喇澡。
實(shí)例一:距離當(dāng)前時(shí)間4秒后執(zhí)行且執(zhí)行一次
public class HelloJob implements Job{
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
//打印當(dāng)前的執(zhí)行時(shí)間
Date date = new Date();
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("當(dāng)前時(shí)間為:"+sf.format(date));
System.out.println("Hello world");
}
}
HelloScheduler類中代碼如下
public class HelloScheduler {
public static void main(String[] args) throws SchedulerException {
//打印當(dāng)前時(shí)間
Date date = new Date();
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("當(dāng)前時(shí)間為:"+sf.format(date));
// 創(chuàng)建一個(gè)JobDetail實(shí)例迅栅,將實(shí)例與HelloJob綁定
JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
.withIdentity("myJob", "ground1")
.build();
//距離當(dāng)前時(shí)間4秒后執(zhí)行且執(zhí)行一次
date.setTime(date.getTime()+4000);
SimpleTrigger trigger = (SimpleTrigger)TriggerBuilder
.newTrigger()
.withIdentity("myTrigger", "group1")
.startAt(date)
.build();
//創(chuàng)建Schedule實(shí)例
SchedulerFactory sFactory = new StdSchedulerFactory();
Scheduler scheduler = sFactory.getScheduler();
scheduler.start();
scheduler.scheduleJob(jobDetail,trigger);
}
}
實(shí)例二:距距離當(dāng)前時(shí)間4秒后首次執(zhí)行任務(wù)之后每隔兩秒重復(fù)執(zhí)行一次,在第一次執(zhí)行再連續(xù)執(zhí)行三次
public class HelloScheduler {
public static void main(String[] args) throws SchedulerException {
//打印當(dāng)前時(shí)間
Date date = new Date();
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("當(dāng)前時(shí)間為:" + sf.format(date));
// 創(chuàng)建一個(gè)JobDetail實(shí)例晴玖,將實(shí)例與HelloJob綁定
JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
.withIdentity("myJob", "ground1").build();
// 距距離當(dāng)前時(shí)間4秒后首次執(zhí)行任務(wù)之后每隔兩秒重復(fù)執(zhí)行一次读存,在第一次執(zhí)行再連續(xù)執(zhí)行三次
date.setTime(date.getTime() + 4000);
SimpleTrigger trigger = (SimpleTrigger) TriggerBuilder
.newTrigger()
.withIdentity("myTrigger", "group1")
.startAt(date)
.withSchedule(
SimpleScheduleBuilder
.simpleSchedule()
.withIntervalInSeconds(2)
.withRepeatCount(3))
.build();
// 創(chuàng)建Schedule實(shí)例
SchedulerFactory sFactory = new StdSchedulerFactory();
Scheduler scheduler = sFactory.getScheduler();
scheduler.start();
scheduler.scheduleJob(jobDetail, trigger);
}
}
實(shí)例三:距離當(dāng)前時(shí)間4秒后首次執(zhí)行,距離當(dāng)前時(shí)間后6秒停止執(zhí)行
public class HelloScheduler {
public static void main(String[] args) throws SchedulerException {
//打印當(dāng)前時(shí)間
Date date = new Date();
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("當(dāng)前時(shí)間為:" + sf.format(date));
// 創(chuàng)建一個(gè)JobDetail實(shí)例呕屎,將實(shí)例與HelloJob綁定
JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
.withIdentity("myJob", "ground1").build();
// 距離當(dāng)前時(shí)間4秒后首次執(zhí)行让簿,距離當(dāng)前時(shí)間后6秒停止執(zhí)行
date.setTime(date.getTime() + 4000);
Date endDate = new Date();
endDate.setTime(endDate.getTime()+6000);
SimpleTrigger trigger = (SimpleTrigger) TriggerBuilder
.newTrigger()
.withIdentity("myTrigger", "group1")
.startAt(date)
.endAt(endDate)
.withSchedule(
SimpleScheduleBuilder
.simpleSchedule()
.withIntervalInSeconds(2)
.withRepeatCount(3))
.build();
// 創(chuàng)建Schedule實(shí)例
SchedulerFactory sFactory = new StdSchedulerFactory();
Scheduler scheduler = sFactory.getScheduler();
scheduler.start();
scheduler.scheduleJob(jobDetail, trigger);
}
}
注意
重復(fù)次數(shù)withRepeatCount:可以是0,正整數(shù)或是SimpleTrigger.REPEAT_INDEFINITELY常量值
重復(fù)執(zhí)行間隔withIntervalInSeconds:必須為0或者長(zhǎng)整數(shù)
指定了endAt參數(shù)秀睛,就會(huì)覆蓋重復(fù)執(zhí)行的效果
認(rèn)識(shí)CronTrigger
基于日歷的作業(yè)調(diào)度器尔当,而不是像SimpleTrigger那樣精確的指定時(shí)間間隔,比SimpleTrigger更常用蹂安。
Cron表達(dá)式
用于配置CronTrigger實(shí)例椭迎,是由7個(gè)子表達(dá)式組成的字符串,描述了時(shí)間表的詳細(xì)信息田盈,格式為:
[秒] [分] [小時(shí)] [日] [月] [周] [年]
實(shí)例一:使用CronTrigger 每秒鐘觸發(fā)一次任務(wù)
public class HelloScheduler {
public static void main(String[] args) throws SchedulerException {
//打印當(dāng)前時(shí)間
Date date = new Date();
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("當(dāng)前時(shí)間為:" + sf.format(date));
// 創(chuàng)建一個(gè)JobDetail實(shí)例畜号,將實(shí)例與HelloJob綁定
JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
.withIdentity("myJob").build();
// 每秒執(zhí)行一次任務(wù)
CronTrigger trigger = (CronTrigger) TriggerBuilder
.newTrigger()
.withIdentity("myTrigger", "group1")
.withSchedule(
CronScheduleBuilder.cronSchedule("* * * * * ? *"))
.build();
// 創(chuàng)建Schedule實(shí)例
SchedulerFactory sFactory = new StdSchedulerFactory();
Scheduler scheduler = sFactory.getScheduler();
scheduler.start();
scheduler.scheduleJob(jobDetail, trigger);
}
}
注意,表達(dá)式中的空格和英文狀態(tài)
Cron表達(dá)式特殊字符意義對(duì)應(yīng)表
Cron表達(dá)式舉例
實(shí)例:
2017年內(nèi)的每天10點(diǎn)15分觸發(fā)一次
0 15 10 允瞧? * * 2017
每天的14點(diǎn)整至14點(diǎn)59分55秒弄兜,以及18點(diǎn)整至18點(diǎn)59分55秒,每5秒鐘觸發(fā)一次
0/5 * 14,18 * * ?
通配符說(shuō)明
Cron表達(dá)式
- L和W可以一起使用瓷式,例如LW表示每個(gè)月的最后一個(gè)工作日
- 周字段英文字母不區(qū)分大小寫
- 利用工具替饿,在線生成百度搜索Crona表達(dá)式在線生成器
Scheduler-工廠模式
所有的Schedule實(shí)例應(yīng)該有SchedulerFactory來(lái)創(chuàng)建,Quartz的三個(gè)核心概念是調(diào)度器贸典,任務(wù)和觸發(fā)器
關(guān)系如下:
Scheduler創(chuàng)建方式
SchedulerFactory sFactory = new StdSchedulerFactory();
Scheduler scheduler = sFactory.getScheduler();
DirectSchedulerFactory factory = DirectSchedulerFactory.getInstance();
Scheduler scheduler2 = factory.getScheduler();
StdSchedulerFactory
- 使用一組參數(shù)(Java.util.Properties)來(lái)創(chuàng)建和初始化Quartz調(diào)度器视卢。
- 配置參數(shù)一般存儲(chǔ)在quartz.properties中。
- 調(diào)用getScheduler方法就能創(chuàng)建和初始化調(diào)度器對(duì)象廊驼。
未完据过,待續(xù)