在JavaEE系統中,我們會經常用到定時任務,比如每天凌晨生成前天報表,每一小時生成匯總數據,查看問題是否已過期等等。那么如何在約定的時間去操作一件事呢?
使用Quartz,這是一個功能比較強大的的調度器,可以讓你的程序在指定時間執行,也可以按照某一個頻度執行,配置起來稍顯復雜
基于java 的定時任務實現
如果你想寫法是這樣的:
<!-- 每天8點執行 -->
<property name="cronExpression">
<value>0 0 8 * * ?</value>
</property>
CRON表達式 含義
"0 0 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分每分鐘一次觸發
"0 0/5 14 * * ?" 每天從下午2點開始到2:55分結束每5分鐘一次觸發
"0 0/5 14,18 * * ?" 每天的下午2點至2:55和6點至6點55分兩個時間段內每5分鐘一次觸發
"0 0-5 14 * * ?" 每天14:00至14:05每分鐘一次觸發
"0 10,44 14 ? 3 WED" 三月的每周三的14:10和14:44觸發
"0 15 10 ? * MON-FRI" 每個周一、周二、周三、周四、周五的10:15觸發
Quartz 時間詳細配置 請查閱:Quartz 教程
需求,我們提交一個問題轉給維修人員,并限定時間期限。代碼中需要每天在規定時間去運行,查詢這個任務是否過期,如果過期則需要推送消息告訴該人員任務已過期(推送消息這邊不涉及)
熟練熟悉Spring配置信息
- 基本配置
(1)配置自己寫的任務類
<bean id="questionTaskTimingTask" class="com.ebei.qpi.backend.timing.QuestionTaskTimingTask" />
這邊熟悉Spring配置的人都能看明白,就不解釋了。
(2)配置觸發器 這邊我們每天晚上一點去跑定時器
<bean id="slTimeTrigger1" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail">
<bean id="errorLogSl1" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject">
<ref local="questionTaskTimingTask" />
</property>
<property name="targetMethod">
<value>expireQuestionTask</value>
</property>
</bean>
</property>
<property name="cronExpression">
<value>0 0 1 * * ?</value>
</property>
</bean>
根據(1)中的Id=“questionTaskTimingTask”,調用(2)每天晚上一點會去運行(1)類中的expireQuestionTask方法,改方法中會查詢出數據庫中限定時間期限大于當前時間的數據,將此類數據設置為超期。
(3)配置總管理類
<bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" lazy-init="false">
<property name="triggers">
<list>
<ref bean="slTimeTrigger1"/>
</list>
</property>
</bean>
lazy-init="false"表示容器啟動就開始執行調度任務, 這里可以配置多個觸發器,可以統一管理
到此,spring中Quartz的基本配置就介紹完了,當然了,使用之前,要導入相應的spring的包與Quartz的包,這些就不多說了。
其實可以看出Quartz的配置看上去還是挺復雜的,沒有辦法,因為Quartz其實是個重量級的工具。