Quartz 与 Spring 集成使用的实例

们通过Spring 的IOC来与Quartz集成使用,对于定时任务,我们可以让这个应用做为jar 小工具在linux下跑,也可以将应用单独放在一个容器里跑。这个视情况而定
一下是一个简单的应用,quartz + Spring 集成使用的核心就这Spring的配置文件

 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:context="http://www.springframework.org/schema/context"
 5     xmlns:aop="http://www.springframework.org/schema/aop" 
 6     xmlns:tx="http://www.springframework.org/schema/tx"
 7     xsi:schemaLocation="http://www.springframework.org/schema/beans         
 8         http://www.springframework.org/schema/beans/spring-beans-2.5.xsd   
 9         http://www.springframework.org/schema/context   
10         http://www.springframework.org/schema/context/spring-context-2.5.xsd   
11         http://www.springframework.org/schema/aop   
12         http://www.springframework.org/schema/aop/spring-aop-2.5.xsd   
13         http://www.springframework.org/schema/tx   
14         http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
15 
16     <!-- *************************** 工作任务调度 *************************** -->
17 
18     <!-- 要调用的工作类 -->
19     <bean id="quartzJob_common" class="com.quartz.job.DoJobMethod"></bean>
20 
21     <!-- 可继续加新的任务   -->
22     <!-- 要调用的工作类结束 -->
23 
24     <!-- 定义调用对象和调用对象的方法 -->
25     <bean id="jobtask1"
26         class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
27         <!-- 调用的类 -->
28         <property name="targetObject">
29             <ref bean="quartzJob_common" />
30         </property>
31         <!-- 调用类中的方法 -->
32         <property name="targetMethod">
33             <value>doMethod1</value>
34         </property>
35     </bean>
36 
37     <bean id="jobtask2"
38         class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
39         <!-- 调用的类 -->
40         <property name="targetObject">
41             <ref bean="quartzJob_common" />
42         </property>
43         <!-- 调用类中的方法 -->
44         <property name="targetMethod">
45             <value>doMethod2</value>
46         </property>
47     </bean>
48     <!-- 可继续加新的   -->
49     <!-- 定义调用对象和调用对象的方法结束 -->
50 
51 
52     <!-- 定义触发时间 -->
53     <bean id="doTime1" class="org.springframework.scheduling.quartz.CronTriggerBean">
54         <property name="jobDetail">
55             <ref bean="jobtask1" />
56         </property>
57         <!-- cron表达式 此处定义为每天零辰00:15执行任务 -->
58         <property name="cronExpression">
59             <value>0 15 00 ? * *</value>
60             <!--<value>10 * * ? * *</value>-->
61         </property>
62     </bean>
63     <bean id="doTime2" class="org.springframework.scheduling.quartz.CronTriggerBean">
64         <property name="jobDetail">
65             <ref bean="jobtask2" />
66         </property>
67         <!-- cron表达式   此处定义每1分钟触发一次-->
68         <property name="cronExpression">
69             <value>0 */1 * ? * *</value>
70         </property>
71     </bean> 
72 
73     <bean id="doTime3" class="org.springframework.scheduling.quartz.CronTriggerBean">
74         <property name="jobDetail">
75             <ref bean="jobtask3" />
76         </property>
77         <!-- cron表达式   此处定义每天上午10:30和晚上22:20触发 即每半天触发一次-->
78         <property name="cronExpression">
79             <value>0 30,20 10,22 ? * *</value>
80             <!--<value>10 * * ? * *</value> -->
81         </property>
82     </bean>
83     <!-- 可继续加新的   -->
84     <!-- 定义触发时间结束 -->
85 
86 
87     <!-- 总管理类 如果将lazy-init='false'那么容器启动就会执行调度程序   -->
88     <bean id="start_common" lazy-init="false" autowire="no"    class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
89         <property name="triggers">
90             <list>
91                 <ref bean="doTime1" />
92                 <ref bean="doTime2" />
93                 <!-- 可继续加新的   -->
94 
95             </list>
96         </property>
97     </bean>
98     <!-- 总管理类结束   -->
99 </beans>

下面是一个调度器的入口(多线程)

 1 package com.quartz.job;
 2 
 3 /**
 4  * 任务调度的其中一个入口
 5  * 这个入口类需要这Spring配置文件contextApplication.xml中定义
 6  * 这个入口类可以定义一个或多个
 7  * 该类里的方法,将会有单独的线程来运行
 8  * @author Administrator
 9  *
10  */
11 public class DoJobMethod {
12 
13     public void doMethod1() {
14         System.out.println("我是任务调度的第一个方法");
15     }
16     
17     public void doMethod2() {
18         System.out.println("我是任务调度的第二个方法");
19     }
20 }

要把这web.xml里配置启动加载spring配置文件

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <web-app version="2.4" 
 3     xmlns="http://java.sun.com/xml/ns/j2ee" 
 4     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 5     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
 6     http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
 7   
 8       <listener>
 9         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
10     </listener>    
11     <context-param>
12         <param-name>contextConfigLocation</param-name>
13         <param-value>/WEB-INF/applicationContext.xml</param-value>
14     </context-param>
15 </web-app>

我们经常在这里定义的触发器条件都是比较有规律的,如果你想做到在容器初始化时候调用一下这个任务,就需要一个过滤器来监听容器,用以初始化。

在spring容器初始化这个jobbean时候,指定一个init-method。在这个方法里调用其他的任务方法,这样可以简单解决容器初始化时候做任务
1. 指定init-method

1 <!-- 要调用的工作类 -->
2 <bean id="quartzJob_common" class="com.quartz.job.DoJobMethod" init-method="doMethod"></bean>

2. 这init-method里调用任务方法

 1 public class DoJobMethod {
 2 
 3     public void doMethod() {
 4         doMethod1();
 5         doMethod2();
 6     }
 7     
 8     public void doMethod1() {
 9         System.out.println("我是任务调度的第一个方法");
10     }
11     
12     public void doMethod2() {
13         System.out.println("我是任务调度的第二个方法");
14     }
15 }

 

posted @ 2014-05-07 09:18  Eryk Leung  阅读(235)  评论(0编辑  收藏  举报