spring整合quartz實現定時任務

pom文件

<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.akane.test</groupId>
  <artifactId>test-quartz</artifactId>
  <version>1.0.0</version>
  <packaging>jar</packaging>
  <name>test-quartz</name>

   <properties>
      <springframework.version>4.0.6.RELEASE</springframework.version>
      <quartz.version>2.2.1</quartz.version>
   </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>

   </dependencies>
</project>


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.akane.test.quartz"/>

    <!--簡單任務:調度某個對象的某個方法,使用MethodInvokingJobDetailFactoryBean,
    任務類能夠不實現Job接口,經過targetMethod指定調用方法-->
    <bean id="simpleJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject" ref="testQuartz1"/>
        <property name="targetMethod" value="testSimpleDetail"/>
        <!--false表示等上一個任務執行完後再開啓新的任務-->
        <property name="concurrent" value="false"/>
    </bean>

    <!--複雜任務:調度帶依賴對象的Job任務-->
    <bean name="complexJobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
        <!--TestQuartz1繼承QuartzJobBean,實現了Job接口-->
        <!--Quartz的默認JobFactory實如今job被實例化的時候會自動調用set方法將依賴對象注入-->
        <property name="jobClass" value="com.akane.test.quartz.TestQuartz1"/>
        <!--JobDataMap是Java Map接口的一個實現,能夠包含不限量的(序列化的)數據對象-->
        <!--JobDataMap裏的數據能夠經過executeInternal函數的JobExecutionContext參數取出
        就本例而言,Map裏的對象和經過set注入的對象實際上是同一個-->
        <property name="jobDataMap">
            <map>
                <entry key="complexDetailInvoker" value-ref="complexDetailInvoker"/>
            </map>
        </property>
        <!--若是一個job是非持久的,當沒有活躍的trigger與之關聯的時候,會被自動地從scheduler中刪除。
        也就是說,非持久的job的生命期是由trigger的存在與否決定的-->
        <property name="durability" value="true"/>
    </bean>


    <!--簡單觸發器: 延遲1秒啓動,每隔2秒執行一次,任務執行完要5秒,間隔2秒,不容許併發執行的狀況下會等任務執行完
    再開啓下次任務-->
    <bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
        <property name="jobDetail" ref="simpleJobDetail"/>
        <!--延遲1秒啓動-->
        <property name="startDelay" value="1000"/>
        <!--每隔2秒執行一次-->
        <property name="repeatInterval" value="2000"/>
    </bean>


    <!-- 帶cron表達書的觸發器:每隔5秒執行一次 -->
    <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <property name="jobDetail" ref="complexJobDetail"/>
        <property name="cronExpression" value="0/5 * * * * ? "/>
    </bean>


    <!-- 調度器工廠bean經過jobdetail和trigger生成調度器 -->
    <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>
    </bean>

</beans>


測試類

@Component("testQuartz1")
public class TestQuartz1 extends QuartzJobBean {

    //要注入的對象
    private ComplexDetailInvoker complexDetailInvoker;

    //必須提供set方法
    public void setComplexDetailInvoker(ComplexDetailInvoker complexDetailInvoker) {
        this.complexDetailInvoker = complexDetailInvoker;
    }
    //簡單任務直接執行
    public void testSimpleDetail(){
        for (int i = 1; i <=5 ; i++) {
            System.out.println("simple quartz-test invoke "+i+" time");
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    @Override
    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
        //JobDataMap中獲取要執行的任務對象
        ComplexDetailInvoker complexDetailInvoker = (ComplexDetailInvoker) context.getJobDetail().getJobDataMap().get("complexDetailInvoker");
        complexDetailInvoker.testComplexDetail();
        //經過set方法注入的任務對象
        this.complexDetailInvoker.testComplexDetail();
        //查看是不是同一個對象
        System.out.println(complexDetailInvoker==this.complexDetailInvoker);
    }
}

測試類依賴對象

@Component("complexDetailInvoker")
public class ComplexDetailInvoker {
    public void testComplexDetail(){
        System.out.println("complex quartz-test!");
    }
}


測試啓動類

public class AppMain {
    public static void main(String[] args) {
        final ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("classpath:spring-quartz.xml");
    }
}

測試結果

simple quartz-test invoke 5 time
simple quartz-test invoke 1 time
simple quartz-test invoke 2 time
simple quartz-test invoke 3 time
complex quartz-test!
complex quartz-test!
true
simple quartz-test invoke 4 time
simple quartz-test invoke 5 time
simple quartz-test invoke 1 time
complex quartz-test!
complex quartz-test!
true
simple quartz-test invoke 2 time
simple quartz-test invoke 3 time
simple quartz-test invoke 4 time
simple quartz-test invoke 5 time
simple quartz-test invoke 1 time
complex quartz-test!
complex quartz-test!
true
simple quartz-test invoke 2 time
simple quartz-test invoke 3 time
simple quartz-test invoke 4 time
simple quartz-test invoke 5 time
complex quartz-test!
complex quartz-test!
true
simple quartz-test invoke 1 time
simple quartz-test invoke 2 time

參考資料

Spring 4 + Quartz Scheduler Integration Example

相關文章
相關標籤/搜索