关于Spirng Quartz定时触发器+源码示例!

来源:互联网 发布:java 集合 编辑:程序博客网 时间:2024/05/28 23:21

  最近实现了一个业务,刚好需要用到Spring 触发器,特写了一个Spring 触发器Demo供大家学习参考!

     Demo简单的实现了定时报时功能,通过Spring 触发器实现每分钟报一次时间!

Demo结构如下:



 运行结果如下:


 

简单解释一下Quartz:

    Quartz调度器为调度工作提供了更丰富的支持。和Java定时器一样,可以使用Quartz来每隔多少毫秒执行一个工作。但Quartz比Java Timer更先进之处在于它允许你调度一个工作在某个特定的时间或日期执行。关于Quartz的更多信息,可以访问Quartz位于http://www.opensymphony.com/quartz的主页。


在简单介绍下创建触发器的步骤:

    首先需要创建一个工作类,这个类必须继承Spring的QuartzJobBean 

Tellingthetimejob.java代码  收藏代码
  1. package jobs;  
  2.   
  3. import org.quartz.JobExecutionContext;  
  4. import org.quartz.JobExecutionException;  
  5. import org.springframework.scheduling.quartz.QuartzJobBean;  
  6. import service.ITellingTheTimeService;  
  7.   
  8.   
  9. /**  
  10.  * @ProjectName:报时Demo     
  11.  * @ClassName:TellingTheTimeJob     
  12.  * @Description:     
  13.  * @author:Sheep  
  14.  * @date:2012-4-19 下午03:58:11     
  15.  * @Modifier:   
  16.  * @Modify Date:    
  17.  * @Modify Note:     
  18.  * @version  
  19.  */  
  20. public class TellingTheTimeJob extends QuartzJobBean {  
  21.       
  22.     private ITellingTheTimeService tellingTheTimeService = null;  
  23.   
  24.     @Override  
  25.     protected void executeInternal(JobExecutionContext arg0) throws JobExecutionException {  
  26.         //调用报时方法  
  27.         this.tellingTheTimeService.tellingTheTime();  
  28.     }  
  29.   
  30.     public ITellingTheTimeService getTellingTheTimeService() {  
  31.         return tellingTheTimeService;  
  32.     }  
  33.   
  34.     public void setTellingTheTimeService(  
  35.             ITellingTheTimeService tellingTheTimeService) {  
  36.         this.tellingTheTimeService = tellingTheTimeService;  
  37.     }  
  38. }  

     QuartzJobBean是Quartz中与Java的TimerTask等价的类。它实现了org.quartz.Job接口。executeInternal()方法定义了当预定的时刻来临时应该执行哪些动作。


接着我们须在Sping配置文件中声明这个Job。

Xml代码  收藏代码
  1. <!-- 配置一个Job -->  
  2.     <bean id="tellTheTimeJob" class="org.springframework.scheduling.quartz.JobDetailBean">  
  3.         <property name="jobClass" value="jobs.TellingTheTimeJob"/>  
  4.         <property name="jobDataAsMap">  
  5.             <map>  
  6.                 <entry key="tellingTheTimeService" value-ref="tellingTheTimeService"></entry>  
  7.             </map>  
  8.         </property>  
  9.     </bean>  

    JobDetailBean 是Quartz的org.quartz.JobDetail的子类,它要求通过jobClass属性来设置一个Job对象。 
    使用Quartz的JobDetail中的另一个特别之处是TellingTheTimeJob 的tellingTheTimeService 属性是间接设置的。JobDetail的jobDataAsMap属性接受一个java.util.Map,其中包含了需要设置给jobClass的各种属性。在这里,这个map包含了一个指向tellingTheTimeService的引用,它的键值为tellingTheTimeService 。当JobDetailBean实例化时,它会将tellingTheTimeService注入到TellingTheTimeJob 的tellingTheTimeService属性中。


    一个Job定义好了,那么我们怎么来实现触发器来调用这个Job呢?接着我们需要在Sping配置触发器。

    Spring提供了两个触发器,SimpleTriggerBean和CronTriggerBean。

    我们现在看看SimpleTriggerBean是怎么配置的,如下:

Xml代码  收藏代码
  1. <!-- 简单的触发器 -->  
  2.     <bean id="simpleTellTheTimeTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">  
  3.         <property name="jobDetail">  
  4.             <ref bean="tellTheTimeJob" />  
  5.         </property>  
  6.         <!-- 以毫秒为单位,启动后一分钟触发 -->  
  7.         <property name="startDelay">  
  8.             <value>60000</value>  
  9.         </property>  
  10.         <!-- 每间隔一分钟触发一次 -->  
  11.         <property name="repeatInterval">  
  12.             <value>60000</value>  
  13.         </property>  
  14.     </bean>  

    SimpleTriggerBean与ScheduledTimerTask类似。你可以用它来指定一个工作应该以怎样的频度运行,以及(可选地)在第一次运行工作之前应该等待多久。其中,jobDetail 属性告诉触发器调度哪个工作。

    我们再来看看CronTriggerBean是怎么配置的,如下:

Xml代码  收藏代码
  1. <!-- 复杂的触发器 -->  
  2.     <bean id="complexTellTheTimeTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">  
  3.         <property name="jobDetail">  
  4.             <ref bean="tellTheTimeJob"/>  
  5.         </property>  
  6.         <property name="cronExpression">  
  7.             <!-- 这里是重点,可以自定义表达式实现定时触发。以下含义是每分钟触发一次 -->  
  8.             <value>0 0/1 * * * ?</value>  
  9.         </property>  
  10.     </bean>  

    和SimpleTriggerBean一样,jobDetail属性告诉触发器调度哪个工作。属性cronExpression告诉触发器何时触发。我们可以通过配置cronExpression属性的value值来实现赋值的触发逻辑。 

    一个cron表达式有至少6个(也可能是7个)由空格分隔的时间元素。从左至右,这些元素的定义如下:

1.秒(0–59)
2.分钟(0–59)
3.小时(0–23)
4.月份中的日期(1–31)
5.月份(1–12或JAN–DEC)
6.星期中的日期(1–7或SUN–SAT)
7.年份(1970–2099)

    每一个元素都可以显式地规定一个值(如6),一个区间(如9-12),一个列表(如9,11,13)或一个通配符(如*)。“月份中的日期”和“星期中的日期”这两个元素是互斥的,因此应该通过设置一个问号(?)来表明你不想设置的那个字段。表7.1中显示了一些cron表达式的例子和它们的意义:

一些cron表达式的例子
表   达   式                 意     义
0 0 10,14,16 * * ?                     每天上午10点,下午2点和下午4点
0 0,15,30,45 * 1-10 * ?                每月前10天每隔15分钟
30 0 0 1 1 ? 2012                      在2012年1月1日午夜过30秒


   到了这里所需的一切都准备好了,那么如果启动这个触发器呢?我们需要在Sping XML如下配置:

Xml代码  收藏代码
  1. <!-- Spring触发工厂 -->  
  2.     <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">  
  3.         <property name="triggers">  
  4.             <list>  
  5.                 <ref bean="complexTellTheTimeTrigger"/>  
  6.                 <!-- ....下面可以继续添加其他触发器 -->  
  7.             </list>  
  8.         </property>  
  9.     </bean>  

   Spring的SchedulerFactoryBean 是Quartz中与TimerFactoryBean等价的类。属性triggers接受一组触发器。因此只需简单地装配一个包含complexTellTheTimeTrigger的一个引用的即可。


    这里就实现了每分钟报一次时间的业务需求,下面附上源码(包含了所需的Jar包)供大家学习参考。

 

  • timerDemo.rar (1.6 MB)
  • 下载次数: 147
  • 查看图片附件


http://resp.iteye.com/blog/1490575