歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Spring 動態定時器

Spring靜態定時器,可以參考:

Spring3.0定時任務 (一) 簡單示例 http://www.linuxidc.com/Linux/2012-12/76483.htm

Spring定時任務 (二) 多個任務和執行時間間隔配置 http://www.linuxidc.com/Linux/2012-12/76484.htm

以前一直都用靜態的定時器,非常簡單,只需要做兩件事:1、寫執行任務的類和方法;2、寫好配置文件。當然執行任務的間隔也是寫死在配置文件中了的。對於很多操作,比如備份數據、同步數據等等都可以完成,但是對於更加靈活的定時器就不行了。於是就有了動態定時器的概念。

動態定時器:執行任務的時間由程序自己控制,而不是由配置文件決定。

先說一下我自己的理解和思路,然後貼我的例子:

根據我參考的文章中提到的:定時器的定時的核心在於cronException,也就是我們在配置文件中配置的:

<property name="cronExpression"> 
              <value>0/10 * * * * ?</value>
 </property>

如果我們能夠將此處動態設置,也就實現了動態定時器。所以,動態定時器的核心在於對於這個參數的設置cronException。靜態的是寫在配置文件中,動態的是寫到程序中,具體怎樣動態的寫到程序中的呢?看下面的例子:

下面將我自己寫的例子貼上,測試運行成功的:

首先是運行環境: spring2.5.6+quartz1.8(spring一般都用3.0以上了,我們這個項目用的2.5而已,親可以用3.0以上的版本),相關需要引入的jar和配置文件過程此處略過。

代碼:

package test;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.log4j.Logger;
 
//執行任務的類
public class ScheduleInfoAction{ 
//    Logger logger = Logger.getLogger(ScheduleInfoAction.class); 
    //執行任務的方法
    public void reScheduleJob()  { 
     SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
     System.out.println("執行操作"+dateFormat.format(new Date()));
    } 


package test;

import java.io.Serializable;
import java.text.ParseException;

import org.springframework.scheduling.quartz.CronTriggerBean;

//繼承org.springframework.scheduling.quartz.CronTriggerBean;
//父類就是靜態定時器中用到的觸發器
public class InitCronTrigger extends CronTriggerBean implements Serializable { 
 
    public InitCronTrigger() throws ParseException {
        setCronExpression(getCronExceptionDB());  //在構造方法中設置cronException參數
    }
    private String getCronExceptionDB(){ 
        String sql = "select CRON from t_test_task_trigger where available = 1 and trigger_name = 'cronTrigger'"; 
        System.out.println("*****" + sql); 
        return "* * * 11 12 ?"; //此處作為測試,直接返回結果,可以根據需要從數據庫中讀取
    } 

配置文件(spring-application-quatz.xml)

<?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:aop="http://www.springframework.org/schema/aop"
      xmlns:tx="http://www.springframework.org/schema/tx"
      xsi:schemaLocation="http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
      http://www.springframework.org/schema/aop
      http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
      http://www.springframework.org/schema/tx
      http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"
      default-autowire="no" default-lazy-init="false">
 
    <!-- 配置spring響應觸發器的入口 -->
    <bean id="schedulerFactory" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> 
        <property name="triggers"> 
            <list> 
                <ref local="cronTrigger"/> 
            </list> 
        </property> 
    </bean> 
    <bean id="scheduleInfoAction" class="test.ScheduleInfoAction"/>
   
   
    <!-- 此處注意:靜態定時器的class為: org.springframework.scheduling.quartz.CronTriggerBean
     我用了自己定義的類,此類繼承了靜態定時器的類,並將執行任務的時間設置放到了類的構造方法中,實現動態定時器的一種方式。
    -->
  <bean id="cronTrigger" class="test.InitCronTrigger">
          <property name="jobDetail" ref="jobDetail"/> 
          <!--
          <property name="cronExpression"> 
              <value>0/10 * * * * ?</value> 
          </property> 
          -->
  </bean>
  <!-- 配置執行任務的類和方法。 -->
    <bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> 
        <property name="targetObject" ref="scheduleInfoAction"/><!-- 執行任務的方法 --> 
        <property name="targetMethod" value="reScheduleJob"/><!-- 執行任務的方法,此處方法不帶參數,即便實際的方法帶參數了,執行過程也會將參數略掉 --> 
        <!-- concurrent設為false,多個job不會並發運行 --> 
        <property name="concurrent" value="false"/> 
    </bean> 
</beans> 

 

 

 

 

Copyright © Linux教程網 All Rights Reserved