无线&移动互联网技术研发

换位思考·····
posts - 19, comments - 53, trackbacks - 0, articles - 283
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

Quartz 与 Spring 集成使用的实例

Posted on 2010-05-28 01:13 Gavin.lee 阅读(905) 评论(0)  编辑  收藏 所属分类: SSH2 --Spring
在前面文章中,有举出不集成但用Quartz的应用,这里,我们通过Spring 的IOC来与Quartz集成使用,对于定时任务,我们可以让这个应用做为jar 小工具在linux下跑,也可以将应用单独放在一个容器里跑。这个视情况而定
一下是一个简单的应用,quartz + Spring 集成使用的核心就这Spring的配置文件中了
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context
="http://www.springframework.org/schema/context"
    xmlns:aop
="http://www.springframework.org/schema/aop" 
    xmlns:tx
="http://www.springframework.org/schema/tx"
    xsi:schemaLocation
="http://www.springframework.org/schema/beans         
        http://www.springframework.org/schema/beans/spring-beans-2.5.xsd   
        http://www.springframework.org/schema/context   
        http://www.springframework.org/schema/context/spring-context-2.5.xsd   
        http://www.springframework.org/schema/aop   
        http://www.springframework.org/schema/aop/spring-aop-2.5.xsd   
        http://www.springframework.org/schema/tx   
        http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"
>

    
<!-- *************************** 工作任务调度 *************************** -->

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

    
<!-- 可继续加新的任务   -->
    
<!-- 要调用的工作类结束 -->

    
<!-- 定义调用对象和调用对象的方法 -->
    
<bean id="jobtask1"
        class
="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        
<!-- 调用的类 -->
        
<property name="targetObject">
            
<ref bean="quartzJob_common" />
        
</property>
        
<!-- 调用类中的方法 -->
        
<property name="targetMethod">
            
<value>doMethod1</value>
        
</property>
    
</bean>

    
<bean id="jobtask2"
        class
="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        
<!-- 调用的类 -->
        
<property name="targetObject">
            
<ref bean="quartzJob_common" />
        
</property>
        
<!-- 调用类中的方法 -->
        
<property name="targetMethod">
            
<value>doMethod2</value>
        
</property>
    
</bean>
    
<!-- 可继续加新的   -->
    
<!-- 定义调用对象和调用对象的方法结束 -->


    
<!-- 定义触发时间 -->
    
<bean id="doTime1" class="org.springframework.scheduling.quartz.CronTriggerBean">
        
<property name="jobDetail">
            
<ref bean="jobtask1" />
        
</property>
        
<!-- cron表达式 此处定义为每天零辰00:15执行任务 -->
        
<property name="cronExpression">
            
<value>0 15 00 ? * *</value>
            
<!--<value>10 * * ? * *</value>-->
        
</property>
    
</bean>
    
<bean id="doTime2" class="org.springframework.scheduling.quartz.CronTriggerBean">
        
<property name="jobDetail">
            
<ref bean="jobtask2" />
        
</property>
        
<!-- cron表达式   此处定义每1分钟触发一次-->
        
<property name="cronExpression">
            
<value>0 */1 * ? * *</value>
        
</property>
    
</bean> 

    
<bean id="doTime3" class="org.springframework.scheduling.quartz.CronTriggerBean">
        
<property name="jobDetail">
            
<ref bean="jobtask3" />
        
</property>
        
<!-- cron表达式   此处定义每天上午10:30和晚上22:20触发 即每半天触发一次-->
        
<property name="cronExpression">
            
<value>0 30,20 10,22 ? * *</value>
            
<!--<value>10 * * ? * *</value> -->
        
</property>
    
</bean>
    
<!-- 可继续加新的   -->
    
<!-- 定义触发时间结束 -->


    
<!-- 总管理类 如果将lazy-init='false'那么容器启动就会执行调度程序   -->
    
<bean id="start_common" lazy-init="false" autowire="no"    class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        
<property name="triggers">
            
<list>
                
<ref bean="doTime1" />
                
<ref bean="doTime2" />
                
<!-- 可继续加新的   -->

            
</list>
        
</property>
    
</bean>
    
<!-- 总管理类结束   -->
</beans>

下面是一个调度器的入口(多线程)
package com.quartz.job;

/**
 * 任务调度的其中一个入口
 * 这个入口类需要这Spring配置文件contextApplication.xml中定义
 * 这个入口类可以定义一个或多个
 * 该类里的方法,将会有单独的线程来运行
 * 
@author Administrator
 *
 
*/

public class DoJobMethod {

    
public void doMethod1() {
        System.out.println(
"我是任务调度的第一个方法");
    }

    
    
public void doMethod2() {
        System.out.println(
"我是任务调度的第二个方法");
    }

}


后话就不用多说了,要这web.xml里配置启动加载spring配置文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" 
    xmlns
="http://java.sun.com/xml/ns/j2ee" 
    xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation
="http://java.sun.com/xml/ns/j2ee 
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
>
  
      
<listener>
        
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    
</listener>    
    
<context-param>
        
<param-name>contextConfigLocation</param-name>
        
<param-value>/WEB-INF/applicationContext.xml</param-value>
    
</context-param>
</web-app>

这里要说一个小事,我们经常在这里定义的触发器条件都是比较有规律的,如果你想做到在容器初始化时候调用一下这个任务,就需要一个过滤器来监听容器,用以初始化。也问了前辈,好像还没有什么更好的办法,如果你有的话,希望不惜赐教

PS:刚想到一个办法,在spring容器初始化这个jobbean时候,指定一个init-method。在这个方法里调用其他的任务方法,这样可以简单解决容器初始化时候做任务
1. 指定init-method
<!-- 要调用的工作类 -->
    
<bean id="quartzJob_common" class="com.quartz.job.DoJobMethod" init-method="doMethod"></bean>

2. 这init-method里调用任务方法
public class DoJobMethod {

    
public void doMethod() {
        doMethod1();
        doMethod2();
    }

    
    
public void doMethod1() {
        System.out.println(
"我是任务调度的第一个方法");
    }

    
    
public void doMethod2() {
        System.out.println(
"我是任务调度的第二个方法");
    }

}

只有注册用户登录后才能发表评论。


网站导航: