<引用于某一博客时间太长忘记-连接了>
动态定时器:执行任务的时间由程序自己控制,而不是由配置文件决定。
定时器的定时的核心在于cronException
1. <property name="cronExpression">
2. <value>0/10 * * * * ?</value>
3. </property>
如果我们能够将此处动态设置,也就实现了动态定时器。所以,动态定时器的核心在于对于这个参数的设置cronException
。静态的是写在配置文件中,动态的是写到程序中,具体怎样动态的写到程序中的呢?看下面的例子:首先是运行环境: spring2.5.6+quartz1.8,相关需要引入的jar和配置文件过程此处略过
1. <?xml version="1.0" encoding="UTF-8"?>
2. <beans xmlns="http://www.springframework.org/schema/beans"
3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4. xmlns:aop="http://www.springframework.org/schema/aop"
5. xmlns:tx="http://www.springframework.org/schema/tx"
6. xsi:schemaLocation="http://www.springframework.org/schema/beans
7. http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
8. http://www.springframework.org/schema/aop
9. http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
10. http://www.springframework.org/schema/tx
11. http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"
12. default-autowire="no" default-lazy-init="false">
13.
14. <!-- 配置spring响应触发器的入口 -->
15. <bean id="schedulerFactory" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
16. <property name="triggers">
17. <list>
18. <ref local="cronTrigger"/>
19. </list>
20. </property>
21. </bean>
22. <bean id="scheduleInfoAction" class="test.ScheduleInfoAction"/>
23.
24.
25. <!-- 此处注意:静态定时器的class为: org.springframework.scheduling.quartz.CronTriggerBean
26. 我用了自己定义的类,此类继承了静态定时器的类,并将执行任务的时间设置放到了类的构造方法中,实现动态定时器的一种方式。
27. -->
28. <bean id="cronTrigger" class="test.InitCronTrigger">
29. <property name="jobDetail" ref="jobDetail"/>
30. <!--
31. <property name="cronExpression">
32. <value>0/10 * * * * ?</value>
33. </property>
34. -->
35. </bean>
36. <!-- 配置执行任务的类和方法。 -->
37. <bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
38. <property name="targetObject" ref="scheduleInfoAction"/><!-- 执行任务的方法 -->
39. <property name="targetMethod" value="reScheduleJob"/><!-- 执行任务的方法,此处方法不带参数,即便实际的方法带参数了,执行过程也会将参数略掉 -->
40. <!-- concurrent设为false,多个job不会并发运行 -->
41. <property name="concurrent" value="false"/>
42. </bean>
43.</beans>
1. package test;
2. import java.text.SimpleDateFormat;
3. import java.util.Date;
4.
5. import org.apache.log4j.Logger;
6.
7. //执行任务的类
8. public class ScheduleInfoAction{
9. // Logger logger = Logger.getLogger(ScheduleInfoAction.class);
10. //执行任务的方法
11. public void reScheduleJob() {
12. SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
13. System.out.println("执行操作"+dateFormat.format(new Date()));
14. }
15.}
16.
17.
18.package test;
19.
20.import java.io.Serializable;
21.import java.text.ParseException;
22.
23.import org.springframework.scheduling.quartz.CronTriggerBean;
24.
25.//继承org.springframework.scheduling.quartz.CronTriggerBean;
26.//父类就是静态定时器中用到的触发器
27.public class InitCronTrigger extends CronTriggerBean implements Serializable {
28.
29. public InitCronTrigger() throws ParseException {
30. setCronExpression(getCronExceptionDB()); //在构造方法中设置cronException参数
31. }
32. private String getCronExceptionDB(){
33. String sql = "select CRON from t_test_task_trigger where available = 1 and trigger_name = 'cronTrigger'";
34. System.out.println("*****" + sql);
35. return "* * * 11 12 ?"; //此处作为测试,直接返回结果,可以根据需要从数据库中读取
36. }
37.}