定時任務Quartz簡單配置與cron表達式
項目中需要一個定時任務 ,尋找到一種使用方式, 記錄下來;
NO.1 配置spring
?1?<!--?要調用的工作類?-->
?2???<bean?id="alarmCheckQuartzJob"?class="com.cqta.oatianai.job.AlarmCheckQuartzJob"/>??
?3???<!--?定義調用對象和調用對象的方法?-->
?4???<bean?id="alarmLogInitQuartzJobTask"?class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">?
?5???????<!--?調用的類?-->
?6?????<property?name="targetObject">?
?7???????<ref?bean="alarmCheckQuartzJob"/>?
?8?????</property>??
?9?<!--?調用類中的方法?-->
10?????<property?name="targetMethod">?
11???????<value>work</value>?
12?????</property>?
13???</bean>??
14???<!--?定義觸發時間?-->
15???<bean?id="alarmLogInitQuartzJobTrigger"?class="org.springframework.scheduling.quartz.CronTriggerBean">?
16?????<property?name="jobDetail">?
17???????<ref?bean="alarmLogInitQuartzJobTask"/>?
18?????</property>??
19??????????<!--?cron表達式每秒鐘觸發一次該任務 -->
20?????<property?name="cronExpression">?
21???????<value>0/1?*?*?*?*??</value>
22?????</property>?
23???</bean>??
24?????<!--?總管理類?如果將lazy-init='false'那么容器啟動就會執行調度程序??-->
25???<bean?id="startQuertz"?lazy-init="false"?autowire="no"?class="org.springframework.scheduling.quartz.SchedulerFactoryBean">?
26?????<property?name="triggers">?
27???????<list>?
28?????????<ref?bean="alarmLogInitQuartzJobTrigger"/>??
29???????</list>?
30?????</property>?
31???</bean>?
NO.2 編寫要調用的工作類
package?com.cqta.oatianai.job;
public?class?AlarmCheckQuartzJob?{
????public?void?work()?{
????????System.out.println("定時任務觸發測試");
????}
}
NO.3 cron表達式編寫
上面配置文件中的表達式,表示每秒鐘觸發一次工作類的work方法(任務)
1???????<!--?cron表達式?-->
2?????<property?name="cronExpression">?
3???????<value>0/1?*?*?*?*??</value>?
4?????</property>
其中 表達式0/1?*?*?*?*??用空格分為了6部分,各部分對應的時間單位定義如下
秒 分 小時 日期 月份 星期 年
字段 | 允許值 | 允許的特殊字符 |
?? | 0-59 | , - * / |
分 | 0-59 | , - * / |
小時 | 0-23 | , - * ? / L W C |
日期 | 1-31 | , - * / |
月份 | 1-12?或者 JAN-DEC | , - * ? / L C # |
星期 | 1-7?或者 SUN-SAT | , - * / |
年(可選) | 留空, 1970-2099 | ?? |
? ?
其中 "?"字符僅被用于天(日期)和天(星期)兩個子表達式,表示不指定值; 當2個子表達式其中之一被指定了值以后,為了避免沖突,需要將另一個子表達式的值設為?
目前個人理解:日期和星期 2部分是互斥的,不能同時定義到表達式中,即2者之一 必須用?
表達式共7個部分 ,最后部分年為可選。每個部分出現的數字和字符的組合,表達了該部分對應的時間單位的約束,不需要約束的部分就用*號代替即可。
其中每個元素可以是一個值(如6),一個連續區間(9-12),一個間隔時間(8-18/4)(/表示每隔4小時),一個列表(1,3,5),通配符。由于"月份中的日期"和"星期中的日期"這兩個元素互斥的,必須要對其中一個設置?.
以下是一些cron表達式實例:
0 0 10,14,16 * * ? 每天上午10點,下午2點,4點
0 0/30 9-17 * * ??? 朝九晚五工作時間內每半小時
0 0 12 ? * WED 表示每個星期三中午12點
"0?0?12?*?*??"?每天中午12點觸發?
"0?15?10???*?*"?每天上午10:15觸發?
"0?15?10?*?*??"?每天上午10:15觸發?
"0?15?10?*?*???*"?每天上午10:15觸發?
"0?15?10?*?*???2005"?2005年的每天上午10:15觸發?
"0?*?14?*?*??"?在每天下午2點到下午2:59期間的每1分鐘觸發?
"0?0/5?14?*?*??"?在每天下午2點到下午2:55期間的每5分鐘觸發?
"0?0/5?14,18?*?*??"?在每天下午2點到2:55期間和下午6點到6:55期間的每5分鐘觸發?
"0?0-5?14?*?*??"?在每天下午2點到下午2:05期間的每1分鐘觸發?
"0?10,44?14???3?WED"?每年三月的星期三的下午2:10和2:44觸發?
"0?15?10???*?MON-FRI"?周一至周五的上午10:15觸發?
"0?15?10?15?*??"?每月15日上午10:15觸發?
"0?15?10?L?*??"?每月最后一日的上午10:15觸發?
"0?15?10???*?6L"?每月的最后一個星期五上午10:15觸發?
"0?15?10???*?6L?2002-2005"?2002年至2005年的每月的最后一個星期五上午10:15觸發?
"0?15?10???*?6#3"?每月的第三個星期五上午10:15觸發?
有些子表達式能包含一些范圍或列表
例如:子表達式(天(星期))可以為 "MON-FRI","MON,WED,FRI","MON-WED,SAT"
"*"字符代表所有可能的值
因此,"*"在子表達式(月)里表示每個月的含義,"*"在子表達式(天(星期))表示星期的每一天
?"/"字符用來指定數值的增量
例如:
在子表達式(分鐘)里的"0/15"表示從第0分鐘開始,每15分鐘?
在子表達式(分鐘)里的"3/20"表示從第3分鐘開始,每20分鐘(它和"3,23,43")的含義一樣
"L" 字符僅被用于天(月)和天(星期)兩個子表達式,它是單詞"last"的縮寫
但是它在兩個子表達式里的含義是不同的。
在天(月)子表達式中,"L"表示一個月的最后一天
在天(星期)自表達式中,"L"表示一個星期的最后一天,也就是SAT
如果在"L"前有具體的內容,它就具有其他的含義了
例如:"6L"表示這個月的倒數第6天,"FRIL"表示這個月的最一個星期五
注意:在使用"L"參數時,不要指定列表或范圍,因為這會導致問題
參考鏈接
http://www.aygfsteel.com/allen-zhe/archive/2007/01/09/92668.html
http://biaoming.javaeye.com/blog/39532
??
追逐和夢想一樣的激情,暖暖的火焰點燃生命,度過暖暖的每一天...
posted on 2010-10-12 14:49 無盡海 閱讀(1088) 評論(0) 編輯 收藏 所屬分類: Quartz