们通过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 }