【Quartz学习总结】——与spring整合

来源:互联网 发布:苹果系统更新数据丢失 编辑:程序博客网 时间:2024/06/05 11:11

一、什么是Quartz?

       Quartz是一个开源的作业调度框架,由java编写,在.NET平台为Quartz.Net,通过Quart可以快速完成任务调度的工作.

二、Quartz能干什么/应用场景
    如网页游戏中挂机自动修炼如8个小时,人物相关数值进行成长,当使用某道具后,时间减少到4个小时,人物对应获得成长值.这其中就 涉及到了Scheduler的操作,定时对人物进行更新属性操作,更改定时任务执行时间.
    网页游戏中会大量涉及到Scheduler的操作,有兴趣的朋友可自行联想.
    企业中如每天凌晨2点触发数据同步、发送Email等操作

三、核心接口

    Scheduler——核心调度器

    Job——任务

    JobDetai——任务描述

    Trigger——触发器

四、Maven引入依赖jar包

  1. <dependency>  
  2.   <groupId>org.springframework</groupId>  
  3.   <artifactId>spring-context-support</artifactId>  
  4.   <version>4.0.6.RELEASE</version>  
  5. </dependency>  
   这个包的作用是什么呢?这个jar 文件包含支持UI模版(Velocity,FreeMarker,JasperReports),邮件服务,脚本服务(JRuby),缓存Cache(EHCache),任务计划Scheduling(uartz)方面的类。
外部依赖spring-context, (spring-jdbc, Velocity, FreeMarker, JasperReports, BSH, Groovy, JRuby, Quartz, EHCache)

五、编写Job代码

  1. package cn.itcast.quartz; 
     
  2. import org.quartz.JobExecutionContext;  
  3. import org.quartz.JobExecutionException;  
  4. import org.springframework.context.ApplicationContext;  
  5. import org.springframework.scheduling.quartz.QuartzJobBean;  
  6.   
  7. /** 
  8.  *  
  9.  *  
  10.  */  
  11. public class MyJob extends QuartzJobBean {  
  12.       
  13.     @Override  
  14.     protected void executeInternal(JobExecutionContext context) throws JobExecutionException {  
  15.         System.out.println("myJob 执行了............." + context.getTrigger().getKey().getName());  
  16.         ApplicationContext applicationContext = (ApplicationContext) context.getJobDetail().getJobDataMap()  
  17.                 .get("applicationContext");  
  18.         System.out.println("获取到的Spring容器是: " + applicationContext);  
  19.           
  20.     }  
  21.   
  22. }  
  和入门程序对比,这个job中的代码显然少了很多,其中我们需要关注的一点就是,我们继承了一个QuartzJobBean,这个是spring 给我提供的包中的一个类,我们只需要重写里面的一个executeInternal即可。

六、CronTrigger 表达式自动生成插件下载地址为:http://download.csdn.net/download/dc2222333/10108996CronTrigger ,表达式的编写学习请点击链接查看点击打开链接

七、spirng配置文件的编写

  1. <!-- 定义任务bean -->  
  2. <bean name="myJobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">  
  3.     <!-- 指定具体的job类 -->  
  4.     <property name="jobClass" value="cn.itcast.quartz.MyJob" />  
  5.     <!-- 指定job的名称 -->  
  6.     <property name="name" value="myJob" />  
  7.     <!-- 指定job的分组 -->  
  8.     <property name="group" value="jobs" />  
  9.     <!-- 必须设置为true,如果为false,当没有活动的触发器与之关联时会在调度器中删除该任务  -->  
  10.     <property name="durability" value="true"/>  
  11.     <!-- 指定spring容器的key,如果不设定在job中的jobmap中是获取不到spring容器的 -->  
  12.     <property name="applicationContextJobDataKey" value="applicationContext"/>  
  13. </bean>  
  14.   
  15. <!-- 定义触发器 -->  
  16. <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">  
  17.     <property name="jobDetail" ref="myJobDetail" />  
  18.     <!-- 每一分钟执行一次 -->  
  19.     <property name="cronExpression" value="0/5 * * * * ?" />  
  20. </bean>  
  21.   
  22. <!-- 定义触发器 -->  
  23. <!-- 演示:一个job可以有多个trigger; -->  
  24. <!-- <bean id="cronTrigger2" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">  
  25.     <property name="jobDetail" ref="myJobDetail" />  
  26.     每一分钟执行一次  
  27.     <property name="cronExpression" value="0 */1 * * * ?" />  
  28. </bean> -->  
  29.   
  30. <!-- 定义调度器 -->  
  31. <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">  
  32.     <property name="triggers">  
  33.         <list>  
  34.             <ref bean="cronTrigger" />  
  35.            <!--  <ref bean="cronTrigger2" /> -->  
  36.         </list>  
  37.     </property>  
  38. </bean>
  39. 小结 这个时候只要我们启动spring容器后,定时任务就是按照我们编写的频率和job自动执行。

      当我们和spring进行整合以后,我们的开发变得非常的简单,但是这里有两个问题:


      一个job能否多个trigger?  可以


      在上面代码中我们已经进行了测试,同时将一个job添加到多个trigger中是没有问题的,代码如上。


      一个trigger能否多个job?  不可以


原创粉丝点击