spring配置定时器方法2


2007-08-06 17:04



Spring支持一个开源任务排程框架---Quartz,记得以前和同学还在考虑如何自动发邮件的问题,如果有了这个
自然而然就可以解决,在方法1中只是简单的制订了定时器,但是如果要考虑多种状况,还是应该使用Quratz来
进行配置,如下是一个转载的例子,好使,大家可以看一下:

方法2:

<?xml version="1.0" encoding="UTF-8"?> 
 

   <bean id="sayHelloJob" class="org.springframework.scheduling.quartz.JobDetailBean">
     <property name="jobClass">
       <value>test.timerTask.SayHelloTaskUsingQuartz</value>
     </property>
   </bean>
<!-- 关键在如下两个触发器的配置 -->
<!-- 类似于Java的简单触发器 -->
   <bean id="helloTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">

     <property name="jobDetail">
       <ref bean="sayHelloJob"/>
     </property>
     <property name="startDelay">
       <value>1000</value>
     </property>
     <property name="repeatInterval">
       <value>3000</value>
     </property>
   </bean>
<!-- 复杂触发器 -->
   <bean id="helloCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">

     <property name="jobDetail">
       <ref bean="sayHelloJob"/>
     </property>
     <property name="cronExpression">
       <!-- 关键在配置此表达式 -->
       <value>0 49 15 * * ?</value>
     </property>
   </bean>

   <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
     <property name="triggers">
       <ref bean="helloCronTrigger"/>
     </property>
   </bean>

 

当有任务触发时,spring会去调用quartzJob的execute()方法,在这个方法里我们就可以写一些我们自己的业务操作。

上面只是说了定时和任务出发时的处理,下面再看看如何动态的添加定时任务

package com.actmaps.scheduler;
import java.text.ParseException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.quartz.CronTrigger;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SimpleTrigger;
import org.quartz.impl.StdSchedulerFactory;/**
* TODO 设置定时任务的控制类
* @author PHeH<br>
* Created On 16:11:24
*/
public class Schedule{/**
   * TODO 添加一个新的触发器
   * @return 
   * @author PHeH<br>
   * Created On 2006-6-9 16:24:54
   */
public boolean insertTrigger()
{
   try {
    Scheduler scheduler = (Scheduler) StdSchedulerFactory.getDefaultScheduler( );
    CronTrigger newCronTrigger = new CronTrigger();
    try {
     newCronTrigger.setName("newCronTrigger");
     newCronTrigger.setCronExpression(this.formatQuartzString());
     newCronTrigger.setJobName("quartzJob");
    } catch (ParseException e) {
     e.printStackTrace();
     log.error("解析触发器字符串格式出错:"+e.getMessage());
    }
    scheduler.scheduleJob(newCronTrigger);
   } catch (SchedulerException e1) {
    e1.printStackTrace();
    log.error("添加新触发器时发生SchedulerException异常:"+e1.getMessage());
   }
   return false;
}}
对于复杂触发器的cronExpression,可借鉴linux的cron。
关于cronExpression的介绍:














每天早上6点


0 6 * * *  


每两个小时


0 */2 * * *

晚上11点到早上8点之间每两个小时,早上八点


0 23-7/2,8 * * *


每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点


0 11 4 * 1-3

1月1日早上4点


0 4 1 1 *


 

</beans>

这里的JobDetail使用的是JobDetailBean,这样直接实例化test.timerTask.SayHelloTaskUsingQuartz。它存在一个问题,当test.timerTask.SayHelloTaskUsingQuartz需要使用依赖注入时,显然,这样直接实例化是没法进行注入的。spring还提供了另一种方法,如下

<bean id="quartzJob" class="com.actmaps.scheduler.QuartzJob">
   <property name="reminderControl">
    <ref bean="reminder"/>
   </property>
</bean>
<bean id="methodInvokingJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">        
   <property name="targetObject">
    <ref bean="quartzJob"/>
   </property>
   <property name="targetMethod">
    <value>execute</value>
   </property>
</bean> 
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "spring-beans.dtd" > 
 

 
<beans>


字段


允许值


允许的特殊字符

  

0-59

  

, - * /

  

0-59

  

, - * /

小时

  

0-23

  

, - * /

日期

  

1-31

  

, - * ? / L W C

月份

  

1-12 或者 JAN-DEC

  

, - * /

星期

  

1-7 或者 SUN-SAT

  

, - * ? / L C #

年(可选)

  

留空, 1970-2099

  

, - * /