美文网首页
Quartz 集成Spring的2种方法

Quartz 集成Spring的2种方法

作者: 水车 | 来源:发表于2017-10-27 17:02 被阅读374次

    引言

    关于Spring集成Quartz有2种方法:

    1. JobDetailBean.
    2. MethodInvokeJobDetailFactoryBean.

    版本:

    spring:4.3.5
    quartz:2.2.1

    注意点

    1. spring3.1之前的版本只能使用quartz1.x系列,spring3.2及以上版本才支持quartz2.x
    2. 则是spring对于quartz的支持实现org.springframework.scheduling.quartz.CronTriggerBean继承了org.quartz.CronTrigger,在quartz1.x系列中org.quartz.CronTrigger是个类,而在quartz2.x系列中org.quartz.CronTrigger变成了接口,从而造成无法用spring的方式配置quartz的触发器(trigger)。
    3. spring3以后,从原来的一个jar变成了现在的好几个jia包.而对quartz支持的jar包在spring-support这个里,所以在使用Spring集成Quartz的时候,一定不要忘记引入spring-support这个包:
      3.1 spring-support.jar 这个jar 文件包含支持UI模版(Velocity,FreeMarker,JasperReports),邮件服务,脚本服务(JRuby), 缓存Cache(EHCache),任务计划Scheduling(uartz)方面的类。
      3.2 外部依赖spring-context, (spring-jdbc, Velocity, FreeMarker, JasperReports, BSH, Groovy, JRuby, Quartz, EHCache)

    maven导入的包如下 部分pom.xml的内容

    <!--quartz -->
    <dependency>
        <groupId>org.quartz-scheduler</groupId>
        <artifactId>quartz</artifactId>
        <version>${quartz.version}</version>
    </dependency>
    
    <!-- spring MVC -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context-support</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>${spring.version}</version>
    </dependency>
    
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>${spring.version}</version>
    </dependency>
    
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>${spring.version}</version>
    </dependency>
    
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>${spring.version}</version>
    </dependency>
    
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-oxm</artifactId>
        <version>${spring.version}</version>
    </dependency>
    

    Spring集成Quartz方法一:JobDetailBean

    1. 创建一个Job方法,此方法必须继承QuartzJobBean 或者 实现Job方法。
    package com.ruixunyun.www.quartz;
    
    import org.quartz.Job;
    import org.quartz.JobExecutionContext;
    import org.quartz.JobExecutionException;
    import org.springframework.beans.factory.annotation.Autowired;
    
    public class TaskPeakStatistics implements Job{
        @Override
        public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
            System.out.println("quartz 执行了");
        }
    }
    
    1. XML配置

    新建一个xml文件:取名: spring-quartz.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
        <bean id="jobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
            <property name="jobClass" value="com.ruixunyun.www.quartz.TaskPeakStatistics"></property>
            <property name="durability" value="true"></property>
        </bean>
    
        <bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
            <property name="jobDetail" ref="jobDetail" />
            <property name="startDelay" value="3000" />
            <property name="repeatInterval" value="2000" />
        </bean>
    
        <!-- 总管理类 如果将lazy-init='false'那么容器启动就会执行调度程序 -->
        <bean id="startQuertz" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
            <!-- 管理trigger -->
            <property name="triggers">
                <list>
                    <ref bean="simpleTrigger" />
                </list>
            </property>
        </bean>
    </beans>
    
    1. 将此xml文件导入到servlet.xml中,spring-servlet.xml是除web.xml的另一个xml,就是这个:
    <!--spring-servlet.xml中导入xml文件-->
    <import resource="spring-quartz.xml"/> 
    

    Spring集成Quartz方法二:MethodInvokeJobDetailFactoryBean

    1. 创建一个Job类,此类不需要继承任何类或者实现任何接口:
    package com.ruixunyun.www.quartz;
    
    import com.ruixunyun.www.service.IQuartzService;
    import org.springframework.beans.factory.annotation.Autowired;
    import java.util.List;
    
    //@Component
    public class TaskPeakStatisticsTest{
        @Autowired
        private IQuartzService quartzService;
    
        public void doSomething() {
            System.out.println("quartz 执行了");
            try{
                List quartzTask = quartzService.quartzQuerytask();
            }catch (Exception e){
                System.out.println(e);
            }
            System.out.println("quartz 执行了2");
        }
    }
    
    1. XML配置
      新建一个xml文件:取名: spring-quartz.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans" 
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans 
           http://www.springframework.org/schema/beans/spring-beans.xsd">
    
        <!-- 要执行任务的任务类。 -->
        <bean id="testQuartz" class="com.ruixunyun.www.quartz.TaskPeakStatisticsTest">
        </bean>
    
        <!-- 将需要执行的定时任务注入JOB中。 -->
        <bean id="testJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
            <property name="targetObject" ref="testQuartz"></property>
            <!-- 任务类中需要执行的方法 -->
            <property name="targetMethod" value="doSomething"></property>
            <!-- 上一次未执行完成的,要等待有再执行。 -->
            <property name="concurrent" value="false"></property>
        </bean>
    
        <!-- 基本的定时器,会绑定具体的任务。 -->
        <bean id="testTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
            <property name="jobDetail" ref="testJob"></property>
            <property name="startDelay" value="3000"></property>
            <property name="repeatInterval" value="2000"></property>
        </bean>
    
        <bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
            <property name="triggers">
                <list>
                    <ref bean="testTrigger"></ref>
                </list>
            </property>
        </bean>
    </beans>
    
    1. 将此xml文件导入到servlet.xml中
        <import resource="spring-quartz.xml"/>
    

    综上:定时任务的基本配置完成。

    两种方法的简单说明

    使用QuartzJobBean,需要继承。而使用MethodInvokeJobDetailFactoryBean则需要指定targetObject(任务实例)和targetMethod(实例中要执行的方法)

    后者优点是无侵入,业务逻辑简单,一目了然,缺点是无法持久化(目前还不太清楚这点!)

    更推荐的第二种,其中一个很重要的原因就是因为定时任务中注入相关Service的时候,后者可以直接注入,而前者还需要进行Schedular的替换修改。

    参考文献

    http://www.cnblogs.com/LiuChunfu/p/5598610.html
    https://devilspace.org/2014/09/11/quartz2-2-2-1-integrtaion-with-spring-4-4-0-5-release-with-maven-build-tool/
    http://blog.csdn.net/jingyang07/article/details/74983099
    http://websystique.com/spring/spring-4-quartz-scheduler-integration-example/

    相关文章

      网友评论

          本文标题:Quartz 集成Spring的2种方法

          本文链接:https://www.haomeiwen.com/subject/yscdpxtx.html