java 调度quartz,java quartz任务调度
1.quartz的結構
quartz包括了3個部分:任務、觸發器和調度器。
(1)任務
Job:是一個接口。要定義自己的任務,必須繼承該接口。該接口只用一個方法void execute(JobExecutionContext context),JobExecutionContext類提供了調度上下文的各種信息。Job運行時的信息保存在JobDataMap實例中。
JobDetail:該類的作用是給自定義的任務綁定組名以及Job名,用來在Scheduler中區分每個Job。該類的構造方法為JobDetail(java.lang.String name, java.lang.String group, java.lang.Class jobClass)。
(2)觸發器
Trigger:該類的作用是描述Job的執行時間規則,有SimpleTrigger和CronTrigger兩個子類。SimpleTrigger用來描述一次觸發或者是固定的時間間隔,CronTrigger則是通過Cron表達式規定固定的時間點。
Calendar:該類表示是特定時間點的集合。一個Trigger可以對應多個Calendar,用來排除或者添加特定的時間點。其下有若干個實現類,如AnnualCalendar、MonthlyCalendar、WeeklyCalendar分別針對每年、每月和每周進行定義。
(3)調度器
Scheduler:該類是quartz的運行容器,Trigger和JobDetail可以注冊到Scheduler中,兩者在Scheduler中擁有各自的組及名稱,組及名稱是Scheduler查找定位容器中某一對象的依據,Trigger的組及名稱必須唯一,JobDetail的組和名稱也必須唯一(但可以和Trigger的組和名稱相同,因為它們是不同類型的)。Scheduler可以將Trigger綁定到某一JobDetail中,這樣當Trigger觸發時,對應的Job就被執行。一個Job可以對應多個Trigger,但一個Trigger只能對應一個Job。
ThreadPool:Scheduler使用一個線程池作為任務運行的基礎設施,任務通過共享線程池中的線程提高運行效率。
2.quartz使用實例
public class PrintJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("executing this job");
}
}
(1)使用SimpleTrigger
public static void main(String[] args) throws SchedulerException {
JobDetail detail = new JobDetail("jName", "jGroup", PrintJob.class);
SimpleTrigger trigger = new SimpleTrigger("stName", "stGroup");
// 當前時間為開始時間
trigger.setStartTime(new Date());
// 每隔2秒執行一次
trigger.setRepeatInterval(2000);
// 執行10次
trigger.setRepeatCount(10);
SchedulerFactory factory = new StdSchedulerFactory();
Scheduler scheduler = factory.getScheduler();
// JobDetail與Trigger關聯
scheduler.scheduleJob(detail, trigger);
scheduler.start();
}
在構造Trigger實例時,可以考慮使用org.quartz.TriggerUtils工具類,該工具類不但提供了眾多獲取特定時間的方法,還擁有眾多獲取常見Trigger的方法。
(2)使用CronTrigger
Cron表達式時間字段
位置
時間域名
允許值
允許的特殊字符
1
秒
0-59
, – * /
2
分鐘
0-59
, – * /
3
小時
0-23
, – * /
4
日期
1-31
, – * ? / L W C
5
月份
1-12
, – * /
6
星期
1-7
, – * ? / L C #
7
年(可選)
空值1970-2099
, – * /
●星號(*):可用在所有字段中,表示對應時間域的每一個時刻,例如,*在分鐘字段時,表示“每分鐘”;
●問號(?):該字符只在日期和星期字段中使用,它通常指定為“無意義的值”,相當于點位符(當日期或者星期存在一個時,另一個可以設置為?);
●減號(-):表達一個范圍,如在小時字段中使用“10-12”,則表示從10到12點,即10,11,12;
●逗號(,):表達一個列表值,如在星期字段中使用“MON,WED,FRI”,則表示星期一,星期三和星期五;
●斜杠(/):x/y表達一個等步長序列,x為起始值,y為增量步長值。如在秒字段中使用0/15,則表示為0,15,30和45秒,而5/15在分鐘字段中表示5,20,35,50分,你也可以使用*/y,它等同于0/y;
●L:該字符只在日期和星期字段中使用,代表“Last”的意思,但它在兩個字段中意思不同。L在日期字段中,表示這個月份的最后一天,如一月的31號,非閏年二月的28號;如果L用在星期中,則表示星期六,等同于7。但是,如果L出現在星期字段里,而且在前面有一個數值X,則表示“這個月的最后X天”,例如,6L表示該月的最后星期五;
●W:該字符只能出現在日期字段里,是對前導日期的修飾,表示離該日期最近的工作日。例如15W表示離該月15號最近的工作日,如果該月15號是星期六,則匹配14號星期五;如果15日是星期日,則匹配16號星期一;如果15號是星期二,那結果就是15號星期二。但必須注意關聯的匹配日期不能夠跨月,如你指定1W,如果1號是星期六,結果匹配的是3號星期一,而非上個月最后的那天。W字符串只能指定單一日期,而不能指定日期范圍;
●LW組合:在日期字段可以組合使用LW,它的意思是當月的最后一個工作日;
●井號(#):該字符只能在星期字段中使用,表示當月某個工作日。如6#3表示當月的第三個星期五(6表示星期五,#3表示當前的第三個),而4#5表示當月的第五個星期三,假設當月沒有第五個星期三,忽略不觸發;
●C:該字符只在日期和星期字段中使用,代表“Calendar”的意思。它的意思是計劃所關聯的日期,如果日期沒有被關聯,則相當于日歷中所有日期。例如5C在日期字段中就相當于日歷5日以后的第一天。1C在星期字段中相當于星期日后的第一天。
表示式
說明
0 15 10 ? * *
每天10:15運行
0 15 10 * * ?
每天10:15運行
0 15 10 * * ? 2008
在2008年的每天10:15運行
0 * 14 * * ?
每天14點到15點之間每分鐘運行一次,開始于14:00,結束于14:59
0 0/5 14 * * ?
每天14點到15點每5分鐘運行一次,開始于14:00,結束于14:55
0 0/5 14,18 * * ?
每天14點到15點每5分鐘運行一次,此外每天18點到19點每5鐘也運行一次
0 0-5 14 * * ?
每天14:00點到14:05,每分鐘運行一次
0 15 10 ? * MON-FRI
每周一,二,三,四,五的10:15分運行
0 15 10 L * ?
每月最后一天10:15分運行
0 15 10 ? * 6L
每月最后一個星期五10:15分運行
0 15 10 ? * 6#3
每月第三個星期五的10:15分運行
public static void main(String[] args) throws SchedulerException {
JobDetail detail = new JobDetail("jName", "jGroup", PrintJob.class);
CronTrigger trigger = new CronTrigger("ctName", "ctGroup");
// 定義表達式
CronExpression cexp = new CronExpression("0/5 * * * * ?");
trigger.setCronExpression(cexp);
SchedulerFactory factory = new StdSchedulerFactory();
Scheduler scheduler = factory.getScheduler();
// JobDetail與Trigger關聯
scheduler.scheduleJob(detail, trigger);
scheduler.start();
}
(3)使用Calendar
public static void main(String[] args) throws SchedulerException {
// 法定節日是以每年為周期的,所以使用AnnualCalendar
AnnualCalendar holidays = new AnnualCalendar();
// 五一勞動節
Calendar laborDay = new GregorianCalendar();
laborDay.add(Calendar.MONTH, 5);
laborDay.add(Calendar.DATE, 1);
// 排除的日期,如果設置為false則為包含
holidays.setDayExcluded(laborDay, true);
// 國慶節
Calendar nationalDay = new GregorianCalendar();
nationalDay.add(Calendar.MONTH, 10);
nationalDay.add(Calendar.DATE, 1);
holidays.setDayExcluded(nationalDay, true);
SchedulerFactory factory = new StdSchedulerFactory();
Scheduler scheduler = factory.getScheduler();
scheduler.addCalendar("holidays", holidays, false, true);
// 設置JobDetail與Trigger
...
scheduler.start();
}
3.spring配置quartz
使用spring,自定義任務不用實現Job接口:
public class PrintJob {
public void execute() {
System.out.println("executing this job");
}
}
spring-quartz.xml
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
加載配置文件便可以執行:
public static void main(String[] args) throws SchedulerException {
ApplicationContext context = new ClassPathXmlApplicationContext("com/ee/test/quartz/spring-quartz.xml");
}
總結
以上是生活随笔為你收集整理的java 调度quartz,java quartz任务调度的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 织梦guestbook.php漏洞,DE
- 下一篇: matlab 滤掉高斯噪声吗,我想问一下