spring整合quartz

来源:互联网 发布:java 合并多个excel 编辑:程序博客网 时间:2024/06/15 02:55

其实quartz在真正项目中使用有两种方式,1种是使用servlet,一种是整合到spring中,今天记录一下后者,

毕竟绝大多数项目都使用了spring。


pom.xml如下,只有quartz和spring的jar依赖和一些编译版本和编码设置

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0"         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">    <modelVersion>4.0.0</modelVersion>    <groupId>quartz_spring</groupId>    <artifactId>quartz_spring</artifactId>    <version>1.0-SNAPSHOT</version>    <properties>        <maven.compiler.source>1.8</maven.compiler.source>        <maven.compiler.target>1.8</maven.compiler.target>        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>        <spring.version>4.2.2.RELEASE</spring.version>        <quartz.version>2.2.2</quartz.version>    </properties>    <dependencies>        <dependency>            <groupId>org.quartz-scheduler</groupId>            <artifactId>quartz</artifactId>            <version>${quartz.version}</version>        </dependency>        <dependency>            <groupId>org.quartz-scheduler</groupId>            <artifactId>quartz-jobs</artifactId>            <version>${quartz.version}</version>        </dependency>        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-core</artifactId>            <version>${spring.version}</version>        </dependency>        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-context</artifactId>            <version>${spring.version}</version>        </dependency>        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-context-support</artifactId>            <version>${spring.version}</version>        </dependency>        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-beans</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-webmvc</artifactId>            <version>${spring.version}</version>        </dependency>        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-aop</artifactId>            <version>${spring.version}</version>        </dependency>        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-tx</artifactId>            <version>${spring.version}</version>        </dependency>    </dependencies></project>

其中最主要的jar是spring-context-support,其中org.springframework.scheduling.quartz帮我们实现了一些方法

方便我们整合quartz

步骤一:创建jobBean

我创建了两个普通bean、ScheduleJobA和ScheduleJobB(后2者实现了Job接口)用于例子展示,

并在ApplicationContext.xml中开启了包扫描

    <context:component-scan base-package="jobs"></context:component-scan>    <context:component-scan base-package="beans"></context:component-scan>

package beans;import org.springframework.stereotype.Component;@Component("myBean")public class MyBean {    public void sayHello() {        System.out.println("hello, i am bean");    }}
package beans;import org.springframework.stereotype.Component;@Component("anotherBean")public class AnotherBean {    public void sayHello() {        System.out.println("hello, i am anotherBean");    }}

package jobs;import beans.AnotherBean;import org.quartz.Job;import org.quartz.JobExecutionContext;import org.quartz.JobExecutionException;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.stereotype.Component;@Componentpublic class ScheduleJobA implements Job {    /*    所有属性都要放在jodDataMap里,在配置文件里添加,使用时再从jodDataMap取,不能直接注入     *///    @Autowired//    @Qualifier("anotherBean")//    private AnotherBean anotherBean;    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {        System.out.println("ScheduleJobA has worked");        System.out.println(jobExecutionContext.getMergedJobDataMap().get("name"));        AnotherBean a = (AnotherBean)jobExecutionContext.getMergedJobDataMap().get("anotherBean");        a.sayHello();        // 直接注入时,属性为空//        System.out.println(anotherBean == null);//        this.anotherBean.sayHello();    }}
package jobs;import org.quartz.Job;import org.quartz.JobExecutionContext;import org.quartz.JobExecutionException;import org.springframework.beans.factory.annotation.Autowired;import beans.AnotherBean;import org.springframework.stereotype.Component;@Componentpublic class ScheduleJobB implements Job {    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {        System.out.println("ScheduleJobB has worked");    }}

步骤二:配置jobBean

我们有2种方法声明配置一个jobBean

1.MethodInvokingJobDetailFactoryBean,我们只要指定一个普通的bean中的某个方法作为job的execute方法就行了,

这里我使用步骤一创建的MyBean

    <!-- 指定一个普通类的某个方法作为任务 -->    <bean id="simpleJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">        <property name="targetObject" ref="myBean" />        <property name="targetMethod" value="sayHello" />    </bean>
2.JobDetailFactoryBean,创建一个实现了Job接口的类,重写execute方法,这里我使用步骤一创建的ScheduleJobB

    <bean id="complexJobDetailB" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">        <property name="jobClass" value="jobs.ScheduleJobB" />        <property name="durability" value="true" />    </bean>
其中jobClass的值就是我们自己创建的job类的路径。

当我们的job类要实现的业务比较复杂,比如需要引用一个外部类的对象,我们不能再像之前一样把该对象的引用

作为job类的属性,再由spring帮我们注入,这样会造成该对象注入失败,正确的方法是在配置jobBean时把

该对象存入jobDataMap中,下面是另一个JobDetailFactoryBean的配置,使用这里我使用

步骤一创建的ScheduleJobA

    <bean id="complexJobDetailA" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">        <property name="jobClass" value="jobs.ScheduleJobA" />        <property name="jobDataMap">            <map>                <entry key="anotherBean" value-ref="anotherBean" />                <entry key="name" value="holien"></entry>            </map>        </property>        <property name="durability" value="true" />    </bean>
其中anotherBean就是我们要引用的外部的类,做测试时,我还在map里存另外一个name属性。


步骤三:配置触发器

触发器也有两种,SimpleTriggerFactoryBeanCronTriggerFactoryBean

    <!-- quartz触发器触发器配置 -->    <bean id="simpleTrigger"  class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">        <property name="jobDetail" ref="simpleJobDetail" />        <!-- 推迟1秒后,每2秒执行一次 -->        <property name="startDelay" value="1000" />        <property name="repeatInterval" value="2000" />    </bean>    <bean id="cronTriggerA"  class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">        <property name="jobDetail" ref="complexJobDetailA" />        <!-- 每4秒执行一次 -->        <property name="cronExpression" value="0/4 * * ? * *" />    </bean>    <bean id="cronTriggerB"  class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">        <property name="jobDetail" ref="complexJobDetailB" />        <!-- 每10秒执行一次 -->        <property name="cronExpression" value="0/10 * * ? * *" />    </bean>


步骤4:配置调度器

使用同样是spring自带的SchedulerFactoryBean把多个触发器存放在一个list中,当作其属性

    <!-- quartz调度器配置 -->    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">        <property name="triggers">            <list>                <ref bean="simpleTrigger"/>                <ref bean="cronTriggerA" />                <ref bean="cronTriggerB" />            </list>        </property>    </bean>
步骤5:运行web项目,或者写一个Appmain方法来运行测试结果

package beans;import org.springframework.context.support.AbstractApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class AppMain {    public static void main(String[] args) {        AbstractApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");    }}
运行结果截图:




原创粉丝点击