1. 程式人生 > >Spring4實戰(二)-Quartz 2.2 整合

Spring4實戰(二)-Quartz 2.2 整合

前面一篇文章介紹了 Quartz的簡單用法,Spring提供了一些類來簡化Quartz的使用。本篇文章將介紹如何在Spring中整合Quartz。

涉及的開發工具與技術

  • Spring 4.2.4.RELEASE
  • Quartz 2.2.2
  • Maven 3
  • JDK 1.7
  • Eclipse JUNO

Project目錄結構

Eclipse Maven Project最終目錄結構如下: 
這裡寫圖片描述

整合流程

下面將詳細講解整合的每一個細節 
1、Maven 依賴配置

<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>com.ricky.quartz</groupId>
    <artifactId>integrity</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>integrity</name>
    <url>http://maven.apache.org</url>

    <properties>
        <quartz.version>2.2.2</quartz.version>
        <springframework.version>4.2.4.RELEASE</springframework.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>${springframework.version}</version>
        </dependency>

        <!-- Transaction dependency is required with Quartz integration -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>${springframework.version}</version>
        </dependency>

        <!-- Quartz framework -->
        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz</artifactId>
            <version>${quartz.version}</version>
        </dependency>


        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.13</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78

2、配置Quartz Job 
在Spring中有兩種方法配置Quartz Job 
1) 使用 MethodInvokingJobDetailFactoryBean

<bean id="simpleJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject" ref="simpleBean" />
        <property name="targetMethod" value="printMessage" />
    </bean>
  • 1
  • 2
  • 3
  • 4

非常簡便,只需要指定一個bean以及需要被執行的方法。

2)使用 JobDetailFactoryBean

<bean name="complexJobDetail"  class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
        <property name="jobClass" value="com.ricky.quartz.integrity.complex.ComplexScheduledJob" />
        <property name="jobDataMap">
            <map>
                <entry key="complexBean" value-ref="complexBean" />
            </map>
        </property>
        <property name="durability" value="true" />
    </bean>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

其中,jobClass需要指定一個 QuartzJobBean的子類(extends QuartzJobBean),jobDataMap 可以向jobClass指定的Job bean 傳引數。 
下面是jobClass 的指定的 QuartzJobBean 實現類

package com.ricky.quartz.integrity.complex;

import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;

public class ComplexScheduledJob extends QuartzJobBean {

    private ComplexBean complexBean;

    @Override
    protected void executeInternal(JobExecutionContext context)
            throws JobExecutionException {

        complexBean.printMessage();
    }

    public void setComplexBean(ComplexBean complexBean) {
        this.complexBean = complexBean;
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

3、配置Quartz Trigger 
Trigger是來定義scheduler何時執行你的job,有兩種配置方式 
1)Simple Trigger , 使用 SimpleTriggerFactoryBean配置

<bean id="simpleTrigger"  class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
        <property name="jobDetail" ref="simpleJobDetail" />
        <property name="startDelay" value="1000" />
        <property name="repeatInterval" value="2000" />
        <property name="repeatCount" value="5" />
    </bean>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

2)Cron Trigger , 使用 CronTriggerFactoryBean配置

<bean id="cronTrigger"  class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <property name="jobDetail" ref="complexJobDetail" />
        <property name="cronExpression" value="0/5 * * * * ?" />
    </bean>
  • 1
  • 2
  • 3
  • 4

4、配置 SchedulerFactoryBean

<bean  class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="jobDetails">
            <list>
                <ref bean="simpleJobDetail" />
                <ref bean="complexJobDetail" />
            </list>
        </property>

        <property name="triggers">
            <list>
                <ref bean="simpleTrigger" />
                <ref bean="cronTrigger" />
            </list>
        </property>

        <property name="configLocation" value="classpath:quartz.properties" />  
    </bean>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

quartz-context.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" xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
                            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">

    <context:component-scan base-package="com.ricky.quartz.integrity" />


    <bean id="simpleJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject" ref="simpleBean" />
        <property name="targetMethod" value="printMessage" />
    </bean>

    <bean name="complexJobDetail"  class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
        <property name="jobClass" value="com.ricky.quartz.integrity.complex.ComplexScheduledJob" />
        <property name="jobDataMap">
            <map>
                <entry key="complexBean" value-ref="complexBean" />
            </map>
        </property>
        <property name="durability" value="true" />
    </bean>


    <bean id="simpleTrigger"  class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
        <property name="jobDetail" ref="simpleJobDetail" />
        <property name="startDelay" value="1000" />
        <property name="repeatInterval" value="2000" />
        <property name="repeatCount" value="5" />
    </bean>


    <bean id="cronTrigger"  class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <property name="jobDetail" ref="complexJobDetail" />
        <property name="cronExpression" value="0/5 * * * * ?" />
    </bean>


    <bean  class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="jobDetails">
            <list>
                <ref bean="simpleJobDetail" />
                <ref bean="complexJobDetail" />
            </list>
        </property>

        <property name="triggers">
            <list>
                <ref bean="simpleTrigger" />
                <ref bean="cronTrigger" />
            </list>
        </property>

        <property name="configLocation" value="classpath:quartz.properties" />  
    </bean>

</beans>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58

5、simple POJO’s Task Beans

com.ricky.quartz.integrity.simple.SimpleBean

package com.ricky.quartz.integrity.simple;

import java.util.Date;
import org.springframework.stereotype.Component;

@Component
public class SimpleBean {

    public void printMessage() {
        System.out.println("simple task invoked by using SimpleTriggerFactoryBean"+new Date());
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

com.ricky.quartz.integrity.complex.ComplexBean

package com.ricky.quartz.integrity.complex;

import java.util.Date;
import org.springframework.stereotype.Component;

@Component
public class ComplexBean {

    public void printMessage(){

        System.out.println("complex task invoked by using CronTriggerFactoryBean"+new Date());
    }
}   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

6、啟動Spring容器

package com.ricky.quartz.integrity;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * Spring Quartz integration example
 *
 */
public class App {

    public static void main(String[] args) {

        ApplicationContext ctx = new ClassPathXmlApplicationContext("quartz-context.xml");
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

執行結果如下: 
complex task invoked by using CronTriggerFactoryBeanTue Jan 05 19:32:05 CST 2016 
simple task invoked by using SimpleTriggerFactoryBeanTue Jan 05 19:32:05 CST 2016 
simple task invoked by using SimpleTriggerFactoryBeanTue Jan 05 19:32:07 CST 2016 
simple task invoked by using SimpleTriggerFactoryBeanTue Jan 05 19:32:09 CST 2016 
complex task invoked by using CronTriggerFactoryBeanTue Jan 05 19:32:10 CST 2016 
simple task invoked by using SimpleTriggerFactoryBeanTue Jan 05 19:32:11 CST 2016 
simple task invoked by using SimpleTriggerFactoryBeanTue Jan 05 19:32:13 CST 2016 
complex task invoked by using CronTriggerFactoryBeanTue Jan 05 19:32:15 CST 2016 
simple task invoked by using SimpleTriggerFactoryBeanTue Jan 05 19:32:15 CST 2016 
complex task invoked by using CronTriggerFactoryBeanTue Jan 05 19:32:20 CST 2016