Quartz的使用前準備:java
1.引入必要的jar包:spring
quartz知識簡單瞭解: 2.quartz的兩種做業存儲方式:數據庫
3.Quartz兩種觸發器api
4.quartz調度器—將任務和觸發器關聯起來。 由scheduler接口體現,該接口主要定義了三個方法:服務器
在spring中使用quartz,建立quartz做業bean的兩種方法: 1.使用JobDetailBean包裝QuartzBean子類的實例工具
2.使用MethodInvokingJobDetailFactoryBean配置方法(以下例Spring-action.xml 配置)this
3.Spring-action.xml 配置內容:日誌
<!-- lang: xml --> <!--quartz demo test start--> <!-- 定義要定時工做bean 並將任務工程注入 --> <bean id="quarzDemo" class="com.pgw.util.QuarzDemo" > <property name="scheduler" ref="schedulerFactory" /> </bean> <!-- 將testQuarzt注入到job中 --> <bean id="testJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <!-- targetObject 爲要定時調用的工做bean --> <property name="targetObject" ref="quarzDemo" /> <!-- targetMethod 爲targetObject中要觸發的方法名 --> <property name="targetMethod" value="doSomething" /> </bean> <!-- 將job注入到定時觸發器 --> <bean id="testTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <!-- 上邊定義好的job Bean注入到觸發器中 --> <property name="jobDetail" ref="testJob" /> <!-- cron表達式,定義要觸發的時間 --> <property name="cronExpression"> <value>0 56 10 * * ?</value> </property> </bean> <!-- 將觸發器注入任務工程 --> <bean id="schedulerFactory" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" lazy-init="false" autowire="no"> <property name="triggers"> <list> <!-- 任務工程中要觸發的觸發器列表 --> <ref local="testTrigger" /> </list> </property> </bean> <!-- 動態填入cron表單式的界面action bean --> <bean id="quartzAction" class="com.pgw.action.QuartzAction"> <property name="quarzDemo" ref="quarzDemo"></property> </bean> <!--quartz demo test end --> </beans>
QuarzDemo類code
<!-- lang: java --> public class QuarzDemo{ private Scheduler scheduler; publicvoid doSomething() { System.out.println("Hello World !!!"); } publicvoid resetJob(String cronExpression){ try { // 運行時可經過動態注入的scheduler獲得trigger, // 注意採用這種注入方式在有的項目中會有問題,若是遇到注入問題, // 能夠採起在運行方法時候,得到bean來避免錯誤發生。 CronTriggerBean trigger = (CronTriggerBean) scheduler.getTrigger("testTrigger", Scheduler.DEFAULT_GROUP); String originConExpression = trigger.getCronExpression(); // 若是相等,則表示用戶並無從新設定數據庫中的任務時間,這種狀況不須要從新rescheduleJob if (!originConExpression.equalsIgnoreCase(cronExpression)) { trigger.setCronExpression(cronExpression); scheduler.rescheduleJob("testTrigger", Scheduler.DEFAULT_GROUP, trigger); } } catch (SchedulerException e) { e.printStackTrace(); } catch (ParseException e) { e.printStackTrace(); } } publicvoid setScheduler(Scheduler scheduler) { this.scheduler = scheduler; } public Scheduler getScheduler() { returnscheduler; } }
注意:xml
1.lazy-init若是設置爲true,這任務工程在服務器啓動時不會加載。因此這裏必須設置爲false。
2.因爲在上邊的配置中定義的了default-autowire="byName", Spring會自動注入quartz中的datasource bean,因此會報異常。 解決方法:在bean中關掉autowired