使用cronTriggerBean子類,動態設置cronExpression(quartz +...

Quartz的使用前準備:java

1.引入必要的jar包:spring

  • quartz_all_xxx.jar 或者quartz_xxx.jar
  • slf4j_api_xx.jar quartz所須要的日誌工具

quartz知識簡單瞭解: 2.quartz的兩種做業存儲方式:數據庫

  • RAMJobStore,利用內存來持久化調度程序信息
  • JDBC做業存儲,利用JDBC驅動和後臺庫中保存的調度程序信息

3.Quartz兩種觸發器api

  • simpleTrigger 適合執行簡單的調度任務
  • cronTrigger 使用cron表達式,調度相對複雜的任務

4.quartz調度器—將任務和觸發器關聯起來。 由scheduler接口體現,該接口主要定義了三個方法:服務器

  • void addJob(JobDetail jobDetail, Boolean replace)
  • Date scheduleJob(JobDetail jobDetail, Trigger trigger) //使用trigger類控制該job
  • Date scheduleJob(Trigger trigger) //添加觸發器調度做業

在spring中使用quartz,建立quartz做業bean的兩種方法: 1.使用JobDetailBean包裝QuartzBean子類的實例工具

  • 建立一個Quartz的做業bean,可是這個bean必需要繼承QuartzJobBean抽象類,其中要實現一個executeInternal(JobExecutionContext ctx)方法。

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

相關文章
相關標籤/搜索