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>