總結(jié)Quartz使用示例總結(jié)
在目前的JAVA應(yīng)用中,任務(wù)調(diào)度應(yīng)用非常廣泛,因此掌握QUARTZ是必要的技能。
少說(shuō)閑話,上官網(wǎng):http://www.quartz-scheduler.org/下載最新1.80資源包
commons-logging log4j sff4j 等待jar包要加入,quartz的jar包肯定是必須的。
先寫(xiě)一個(gè)類(lèi)來(lái)實(shí)現(xiàn)Job接口。
代碼Java
1. public class QuartzDemo implements Job{
2.
3. @Override
4. public void execute(JobExecutionContext arg0) throws JobExecutionException {
5. System.out.println("執(zhí)行我...");
6.
7. }
8.
9. }
然后寫(xiě)上各種各樣的測(cè)試案例
代碼Java
1. public class Test {
2. private static final SimpleTrigger CronTrigger = null;
3.
4. public static void main(String[] args){
5. }
6.
7. public void 特別1(){
8. ///通過(guò)SchedulerFactory獲得調(diào)度器
9. SchedulerFactory schedulerFactory = new StdSchedulerFactory();
10. Scheduler scheduler;
11. try {
12. scheduler = schedulerFactory.getScheduler();
13.
14.
15.
16.
17. //引入操作程序
18. JobDetail jobDetail =
19. new JobDetail("jobDetail-s1", "jobDetailGroup-s1", QuartzDemo.class);
20.
21. ///new觸發(fā)器
22. SimpleTrigger simpleTrigger =
23. new SimpleTrigger("simpleTrigger", "triggerGroup-s1");
24.
25.
26. ///設(shè)定工作啟動(dòng)時(shí)間
27.
28. long ctime = System.currentTimeMillis();
29. simpleTrigger.setStartTime(new Date(ctime));
30.
31.
32. ///設(shè)置工作執(zhí)行間隔。
33. simpleTrigger.setRepeatInterval(1000);
34.
35. ///設(shè)定工作執(zhí)行頻次。
36. simpleTrigger.setRepeatCount(10);
37.
38. //默認(rèn)情況下設(shè)置工作執(zhí)行優(yōu)先
39. //simpleTrigger.setPriority(10);
40.
41.
42. 在調(diào)度器中設(shè)置操作和觸發(fā)器
43. scheduler.scheduleJob(jobDetail, simpleTrigger);
44.
45. //啟動(dòng)調(diào)度器
46. scheduler.start();
47. } catch (SchedulerException e) {
48. // TODO Auto-generated catch block
49. e.printStackTrace();
50. }
51. }
52.
53. public void test2(){
54.
55. try {
56. SchedulerFactory schedFact = new org.quartz.impl.StdSchedulerFactory();
57. Scheduler sched = schedFact.getScheduler();
58. sched.start();
59. JobDetail jobDetail = new JobDetail( " Income Report " ,
60. " Report Generation " , QuartzDemo.class );
61. jobDetail.getJobDataMap().put( " type " , " FULL " );
62. CronTrigger trigger = new CronTrigger( " Income Report " ,
63. " Report Generation " );
64.
65. trigger.setCronexpression_r( "0 33 16 * * ?" );
66. sched.scheduleJob(jobDetail, trigger);
67. } catch (Exception e) {
68. e.printStackTrace();
69. }
70. }
71.
72. public void test3(){
73. ///通過(guò)SchedulerFactory獲得調(diào)度器
74. SchedulerFactory schedulerFactory = new StdSchedulerFactory();
75. Scheduler scheduler;
76. try {
77. scheduler = schedulerFactory.getScheduler();
78. //引入操作程序
79. JobDetail jobDetail =
80. new JobDetail("jobDetail-s1", "jobDetailGroup-s1", QuartzDemo.class);
81. ///new觸發(fā)器
82. CronTrigger simpleTrigger =
83. new CronTrigger("trigger", "group", "job", "group", "16 26/1 8-17 * * ?");
84. // new SimpleTrigger("simpleTrigger", "triggerGroup-s1");
85.
86.
87. ///設(shè)定工作啟動(dòng)時(shí)間
88. //Calendar excelCal = Calendar.getInstance();
89. //excelCal.add(Calendar.DAY_OF_MONTH, 1);
90. ///excelCal.set(Calendar.HOUR_OF_DAY, 16);
91. //excelCal.set(Calendar.SECOND, 0);
92. //excelCal.add(Calendar.MINUTE, 9);
93. // long ctime = System.currentTimeMillis();
94. // simpleTrigger.setStartTime(excelCal.getTime());
95. ///設(shè)置工作執(zhí)行間隔。
96. // simpleTrigger.setRepeatInterval(1000);
97. ///設(shè)定工作執(zhí)行頻次。
98. // simpleTrigger.setRepeatCount(10);
99. //默認(rèn)情況下設(shè)置工作執(zhí)行優(yōu)先
100. //simpleTrigger.setPriority(10);
101.
102. 在調(diào)度器中設(shè)置操作和觸發(fā)器
103. scheduler.scheduleJob(jobDetail, simpleTrigger);
104.
105. //啟動(dòng)調(diào)度器
106. scheduler.start();
107. } catch (SchedulerException e) {
108. // TODO Auto-generated catch block
109. e.printStackTrace();
110. } catch (ParseException e) {
111. // TODO Auto-generated catch block
112. e.printStackTrace();
113. }
114.
115.
116. }
117.
118. }
需要注意的幾點(diǎn)是,org經(jīng)常出現(xiàn)。.quartz.core.ErrorLogger : An error occured instantiating job to be executed...這一異常,解決辦法是
代碼Java
1. 1)Job類(lèi)必須有默認(rèn)的無(wú)參構(gòu)造方法,當(dāng)然不能覆蓋,類(lèi)本來(lái)就是無(wú)參構(gòu)造方法。
2.
3. 2)Jobscope必須是Public類(lèi)型,因?yàn)閝uartz是根據(jù)反射機(jī)制實(shí)例化類(lèi)型,如果不是public類(lèi)型,就不能暴露出來(lái)。
4.
5. 3) Job類(lèi)不能屬于內(nèi)部類(lèi),原因同上,因此,盡量獨(dú)立建類(lèi)
1)Job類(lèi)必須有默認(rèn)的無(wú)參構(gòu)造方法,當(dāng)然不能覆蓋,類(lèi)本來(lái)就是無(wú)參構(gòu)造方法。 2)Jobscope必須是Public類(lèi)型,因?yàn)閝uartz是根據(jù)反射機(jī)制實(shí)例化類(lèi)型,如果不是public類(lèi)型,就不能暴露出來(lái)。 3) Job類(lèi)不能是內(nèi)部類(lèi),原因同上,因此盡量獨(dú)立建類(lèi)。
之后加上我在網(wǎng)上收集的。
代碼Java
1. 環(huán)境變量Quartz:quartz.properties
2. Configure Main Scheduler Properties
3. = TestScheduler
4. = one
5. Configure ThreadPool
6. org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
7. = 5
8. = 4
9. Configure JobStore
10. = 5000
11. org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
12.
13.
14. 附件:cronExpression配備表明
15.
16. 允許值 特殊的許可符號(hào)
17. 0-59 , - * /
18. 0-59 , - * /
19. 0-23 , - * /
20. 1-31 , - * ? / L W C
21. 1-12 或是 JAN-DEC , - * /
22. 1-7 或是 SUN-SAT , - * ? / L C #
23. 留空, 1970-2099 , - * /
24.
25.
26. 意義
27. "0 0 12 * * ? / L C #
23. 留空, 1970-2099 , - * /
24.
25.
26. 意義
27. "0 0 12 * * ?" 每日中午12點(diǎn)觸發(fā)
28. "0 15 10 ? * *" 每天早上10:15觸發(fā)
29. "0 15 10 * * ?" 每天早上10:15觸發(fā)
30. "0 15 10 * * ? *" 每天早上10:15觸發(fā)
31. "0 15 10 * * ? 2005" 每天早上1005年:15觸發(fā)
32. "0 * 14 * * ?" 從下午2點(diǎn)到下午2點(diǎn):每1分鐘觸發(fā)59期間
33. "0 0/5 14 * * ?" 從下午2點(diǎn)到下午2點(diǎn):每55分鐘觸發(fā)55期間
34. "0 0/5 14,18 * * ?" 每天下午2點(diǎn)到2點(diǎn):從下午6點(diǎn)到6點(diǎn),55期間:每55分鐘觸發(fā)55期間
35. "0 0-5 14 * * ?" 從下午2點(diǎn)到下午2點(diǎn):每1分鐘觸發(fā)05期間
36. "0 10,44 14 ? 3 WED" 星期三,每年三月的下午?:10和2:44觸發(fā)
37. "0 15 10 ? * MON-FRI" 從星期一到星期五的早上10:15觸發(fā)
38. "0 15 10 15 * ?" 每月15日早上10:15觸發(fā)
39. "0 15 10 L * ?" 每個(gè)月的最后一天早上10:15觸發(fā)
40. "0 15 10 ? * 6L" 每個(gè)月的最后一個(gè)星期五早上10:15觸發(fā)
41. "0 15 10 ? * 6L 2002-2005" 從2002年到2005年的最后一個(gè)星期五上午:15觸發(fā)
42. "0 15 10 ? * 6#3" 每個(gè)月的第三個(gè)星期五早上10:15觸發(fā)
43.
44. 意義
45. 表示所有值;
46. 表示沒(méi)有說(shuō)明數(shù)值,也就是不要注意它的價(jià)值;
47. 表示指定范圍;
48. 表示附加一個(gè)可能值;
49. 開(kāi)始時(shí)間表示在符號(hào)之前,在符號(hào)之后,表示每次增加的值;
50. L("last") ("last") "L" 用于day-of-“month”字段的意思是 "這個(gè)月的最后一天";用于 day-of-week字段, 這是一個(gè)簡(jiǎn)單的意思 "7" or "SAT"。 如果是在day-of-在week字段中與數(shù)字聯(lián)合使用,這意味著 "這個(gè)月的最后一周是什么" – 比如: "6L" means "這個(gè)月的最后一個(gè)星期五". 當(dāng)我們用“L"不指出目錄值或范圍是非常重要的,否則,我們將得到一些意想不到的結(jié)果。51. W("weekday") 只有day才能使用-of-month字段。51. W("weekday") 只有day才能使用-of-month字段。用于描述最接近指定日(星期一至星期五)的工作日。例如:在day-of-month字段用“15W”指的是“最接近本月第15天工作日”,即如果本月第15天是星期六,則觸發(fā)器將在本月第14天即星期五觸發(fā);如果本月第15天是星期天,則觸發(fā)器將在本月第16天即星期一觸發(fā);如果本月第15天是星期二,那么觸發(fā)器將在這一天觸發(fā)。注:此用法僅在當(dāng)前月份計(jì)算值,不會(huì)超過(guò)當(dāng)前月份?!癢"字符只能在day中使用-of-month指示一天,不能是一個(gè)范圍或目錄。也可以用“LW來(lái)指定這個(gè)月的最后一個(gè)工作日。52. 只有day才能使用-of-字段week。用于指定本月的第幾個(gè)星期。例子:在day-of-本月第三個(gè)星期五(6指周五,3指第三個(gè)),week字段使用“6#3”。如指定日期不存在,觸發(fā)器不會(huì)觸發(fā)。53. 在聯(lián)系calendar之后,計(jì)算了數(shù)值。例子:在day-of-month 使用“5C”字段是指本月第五天或之后包含calendar的第一天;day-of-“1C”字段是指在本周日或之后包含calendar的第一天使用week字段。
本文僅代表作者觀點(diǎn),版權(quán)歸原創(chuàng)者所有,如需轉(zhuǎn)載請(qǐng)?jiān)谖闹凶⒚鱽?lái)源及作者名字。
免責(zé)聲明:本文系轉(zhuǎn)載編輯文章,僅作分享之用。如分享內(nèi)容、圖片侵犯到您的版權(quán)或非授權(quán)發(fā)布,請(qǐng)及時(shí)與我們聯(lián)系進(jìn)行審核處理或刪除,您可以發(fā)送材料至郵箱:service@tojoy.com


