Spring+Quartz定时器结合调用service

来源:互联网 发布:淘宝复制链接打不开啊 编辑:程序博客网 时间:2024/06/05 23:41

转自 : http://blog.csdn.net/sina_wjz/article/details/70332014


一、Spring+Quartz定时器

1、所需JAR包:

spring-context-support版本4.1.4、

quartz版本2.2.1

2、spring-scheduler.xml

[html] view plain copy
  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" xmlns:context="http://www.springframework.org/schema/context"    
  4.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd    
  5.                             http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">    
  6.      
  7.     <context:component-scan base-package="com.ches.timer" />    
  8.      
  9.      
  10.     <!-- 集成方式:JobDetailFactoryBean,并且任务类需要继承QuartzJobBean-->  
  11.     <!-- 定义jobDetail -->  
  12.     <bean id="noticeJobDetailBean" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">  
  13.         <property name="name" value="noticeJob" />  
  14.         <!--  目标类 -->  
  15.         <property name="jobClass" value="com.ches.timer.NoticeTimer" />  
  16.         <!-- durability 表示任务完成之后是否依然保留到数据库,默认false   -->  
  17.         <property name="durability" value="true" />  
  18.     </bean>  
  19.       
  20.     <!-- 触发器CornTrigger -->                                 
  21.     <bean id="noticeTaskTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">  
  22.         <property name="jobDetail" ref="noticeJobDetailBean" />  
  23.         <property name="cronExpression">    
  24.             <!-- 每天零点执行 0 0 0 0 * * ? -->    
  25.             <value>0 0 0 * * ?</value>    
  26.         </property>  
  27.     </bean>  
  28.   
  29.     <!-- 定义核心调度器 -->  
  30.     <bean  class="org.springframework.scheduling.quartz.SchedulerFactoryBean">    
  31.         <property name="jobDetails">    
  32.             <list>    
  33.                 <ref bean="noticeJobDetailBean" />    
  34.             </list>    
  35.         </property>    
  36.      
  37.         <property name="triggers">    
  38.             <list>    
  39.                 <ref bean="noticeTaskTrigger" />    
  40.             </list>    
  41.         </property>    
  42.     </bean>  
  43. </beans>  

3、NoticeTimer.java

[html] view plain copy
  1. package com.ches.timer;  
  2.   
  3. import org.quartz.JobExecutionContext;  
  4. import org.quartz.JobExecutionException;  
  5. import org.springframework.scheduling.quartz.QuartzJobBean;  
  6.   
  7. import com.ches.service.meeting.NoticeService;  
  8. import com.ches.utils.SpringContext;  
  9.   
  10.   
  11. public class NoticeTimer  extends QuartzJobBean{  
  12.       
  13.     private NoticeService noticeService;  
  14.   
  15.     @Override  
  16.     protected void executeInternal(JobExecutionContext context) throws JobExecutionException {  
  17.         try {  
  18.             noticeService = (NoticeService) SpringContext.getBean("noticeService");  
  19.             noticeService.topNoticeTimer();  
  20.         } catch (Exception e) {  
  21.             e.printStackTrace();  
  22.         }       
  23.           
  24.     }  
  25. }  

二、ApplicationContextAware初始化

1、SpringContext.java

[html] view plain copy
  1. package com.ches.utils;  
  2.   
  3. import org.springframework.beans.BeansException;  
  4. import org.springframework.context.ApplicationContext;  
  5. import org.springframework.context.ApplicationContextAware;  
  6.   
  7. public class SpringContext implements ApplicationContextAware {  
  8.   
  9.     private static ApplicationContext applicationContext;  
  10.   
  11.     public void setApplicationContext(ApplicationContext ac)  
  12.             throws BeansException {  
  13.         applicationContext = ac;  
  14.     }  
  15.   
  16.     public static ApplicationContext getApplicationContext() {  
  17.         return applicationContext;  
  18.     }  
  19.   
  20.   
  21.     public static Object getBean(String name) {  
  22.         return applicationContext.getBean(name);  
  23.     }  
  24. }  

2、在Spring的配置文件中配置这个类,Spring容器会在加载完Spring容器后把上下文对象调用这个对象中的setApplicationContext方法:

[html] view plain copy
  1. <bean id="springContext" class="com.ches.utils.SpringContext" lazy-init="false" />  

3、在web项目中的web.xml中配置加载Spring容器的Listener:

[html] view plain copy
  1. <listener>  
  2.         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
  3.     </listener>  

4、在项目中即可通过这个SpringContext调用getBean()方法得到Spring容器中的对象了。


附加说明:

1、调用spring中的service使用的是ApplicationContext获取,并没有在配置文件中引入

2、定时器时间设置解说:

cronExpression 表达式包括以下 7 个字段:
 


小时
月内日期

周内日期
年(可选字段)
特殊字符
 
cronExpression 触发器利用一系列特殊字符,如下所示:
 
反斜线(/)字符表示增量值。例如,在秒字段中“5/15”代表从第 5 秒开始,每 15 秒一次。
 
问号(?)字符和字母 L 字符只有在月内日期和周内日期字段中可用。问号表示这个字段不包含具体值。所以,如果指定月内日期,可以在周内日期字段中插入“?”,表示周内日期值无关紧要。字母 L 字符是 last 的缩写。放在月内日期字段中,表示安排在当月最后一天执行。在周内日期字段中,如果“L”单独存在,就等于“7”,否则代表当月内周内日期的最后一个实例。所以“0L”表示安排在当月的最后一个星期日执行。
 
在月内日期字段中的字母(W)字符把执行安排在最靠近指定值的工作日。把“1W”放在月内日期字段中,表示把执行安排在当月的第一个工作日内。
 
井号(#)字符为给定月份指定具体的工作日实例。把“MON#2”放在周内日期字段中,表示把任务安排在当月的第二个星期一。
 
星号(*)字符是通配字符,表示该字段可以接受任何可能的值。
字段 允许值 允许的特殊字符 
秒 0-59 , - * / 
分 0-59 , - * / 
小时 0-23 , - * / 
日期 1-31 , - * ? / L W C 
月份 1-12 或者 JAN-DEC , - * / 
星期 1-7 或者 SUN-SAT , - * ? / L C # 
年(可选) 留空, 1970-2099 , - * /
 
表达式意义 
"0 0 12 * * ?" 每天中午12点触发 
"0 15 10 ? * *" 每天上午10:15触发 
"0 15 10 * * ?" 每天上午10:15触发 
"0 15 10 * * ? *" 每天上午10:15触发 
"0 15 10 * * ? 2005" 2005年的每天上午10:15触发 
"0 * 14 * * ?" 在每天下午2点到下午2:59期间的每1分钟触发 
"0 0/5 14 * * ?" 在每天下午2点到下午2:55期间的每5分钟触发 
"0 0/5 14,18 * * ?" 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发 
"0 0-5 14 * * ?" 在每天下午2点到下午2:05期间的每1分钟触发 
"0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44触发 
"0 15 10 ? * MON-FRI" 周一至周五的上午10:15触发 
"0 15 10 15 * ?" 每月15日上午10:15触发 
"0 15 10 L * ?" 每月最后一日的上午10:15触发 
"0 15 10 ? * 6L" 每月的最后一个星期五上午10:15触发 
"0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一个星期五上午10:15触发 
"0 15 10 ? * 6#3" 每月的第三个星期五上午10:15触发 
每天早上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 *