任務調度quartz(一)quartz在spring中的集成

對於定時器想必大家都應該挺清楚,就像鬧鐘一樣,在某個指定的時間點定時執行。在Java中我們可以使用quartz來定時調度自己的任務,這個框架爲我們提供很多比較方便的功能,能夠很輕易對我們的任務進行啓動、暫停以及運行週期的修改。
任務調度的意義還是挺大的,例如我們可以寫一個調度平臺來管理和監控自己寫的任務,而在這些任務中我們可以寫自己想要乾的事,比如做個生日提醒啊,只要發現當前是誰的生日,就給自己發個短信或郵件。或者在項目中完成一些特定的數據處理等。這個筆者會在下一篇博客中講到。
接下來,直入正題。

一、所依賴的jar包

一是會依賴spring相關的包,而是會依賴quartz的包,spring已經對quartz提供了支持。

<!-- quartz任務調度 -->
    <dependency>
      <groupId>fakepath</groupId>
      <artifactId>quartz-all</artifactId>
      <version>2.1.6</version>
    </dependency>
    <dependency>
      <groupId>fakepath</groupId>
      <artifactId>quartz-commonj</artifactId>
      <version>2.1.6</version>
    </dependency>

二、spring的中配置

首先準備兩個測試任務類,如下
TestJob.java:

package org.qiyongkang.schedule.quartz.job;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

/**
 * ClassName:TestJob <br/>
 * Function: TODO ADD FUNCTION. <br/>
 * Reason:   TODO ADD REASON. <br/>
 * Date:     2015年12月18日 下午4:37:12 <br/>
 * @author   qiyongkang
 * @version  
 * @since    JDK 1.6
 * @see      
 */
public class TestJob {
    private Logger logger = LogManager.getLogger(TestJob.class.getName());

    public void execute() {
        //獲取當前時間
        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        logger.info("當前時間:{}", sdf.format(date));
    }
}

TestJob2.java:

import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

/**
 * ClassName:TestJob2 <br/>
 * Function: TODO ADD FUNCTION. <br/>
 * Reason:   TODO ADD REASON. <br/>
 * Date:     2015年12月21日 下午7:52:27 <br/>
 * @author   qiyongkang
 * @version  
 * @since    JDK 1.6
 * @see      
 */
public class TestJob2 {
private Logger logger = LogManager.getLogger(TestJob2.class.getName());

    public void execute() {
        //獲取當前時間
        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");

        logger.info("當前時間:{}", sdf.format(date));
    }
}

然後,再來看看在spring中的配置:
spring-timer.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:mvc="http://www.springframework.org/schema/mvc"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.0.xsd">
    <!-- Scheduler的配置 -->
    <bean name="startQuertz" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">  
       <!-- <property name="triggers">  
           <list>  
              <ref bean="testTrigger"/>
              <ref bean="testTrigger2"/>
           </list>  
       </property>   -->
       <property name="autoStartup" value="false"/> <!-- 默認爲true -->
    </bean> 

    <!-- Trigger的配置,指定job執行的時間週期 -->
    <bean id="testTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">  
      <property name="jobDetail" ref="testJobDetail"/>  
      <property name="cronExpression" value="*/5 * * * * ?"/><!-- 每隔5秒鐘觸發一次 -->  
    </bean>
    <bean id="testTrigger2" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">  
      <property name="jobDetail" ref="testJobDetail2"/>  
      <property name="cronExpression" value="*/1 * * * * ?"/><!-- 每隔1秒鐘觸發一次   -->
    </bean> 

    <!-- JobDetail的配置,指定job的執行類和執行方法 -->
    <bean id="testJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">   
      <property name="targetObject" ref="testJob"/>  
      <property name="targetMethod" value="execute"/>  
      <property name="concurrent" value="true"/>
      <!-- 是否允許任務併發執行。當值爲false時,表示必須等到前一個線程處理完畢後纔再啓一個新的線程 -->  
    </bean>
    <bean id="testJobDetail2" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">   
      <property name="targetObject" ref="testJob2"/>  
      <property name="targetMethod" value="execute"/>  
      <property name="concurrent" value="true"/>
    </bean>

    <!-- 業務類的配置 -->
    <bean id="testJob" class="org.qiyongkang.schedule.quartz.job.TestJob"/>
    <bean id="testJob2" class="org.qiyongkang.schedule.quartz.job.TestJob2"/>
</beans>

這裏,我們可以配置web容器啓動後自動調度程序,也可以手動進行啓動和暫停。

三、啓動和暫停

這裏,筆者簡單的寫了這個頁面來控制這兩個任務的啓動和暫停,如下:
這裏寫圖片描述
然後,再來看看springMVC中接受請求的代碼:

/**
     * 
     * operateTask:任務的啓動或停止. <br/>
     *
     * @author qiyongkang
     * @param taskName
     * @param flag:0->啓動,1->停止
     * @return
     * @since JDK 1.6
     */
    @RequestMapping
    @ResponseBody
    public ExtJsObject operateTask(String triggerName, String jobDetailName, Integer flag) {
        ExtJsObject extJsObject = null;
        Scheduler scheduler = startQuertz.getScheduler();

        //獲取CronTrigger
        CronTrigger cronTrigger = SpringUtil.getBean(triggerName);

        //獲取jobDetail
        JobDetail jobDetail = SpringUtil.getBean(jobDetailName);

        try {
            if (flag == 0) {
                //啓動此任務
                scheduler.scheduleJob(jobDetail, cronTrigger);
                if (!scheduler.isStarted()) {
                    scheduler.start();
                }
            } else if (flag == 1) {
                //停止此任務
                scheduler.pauseTrigger(cronTrigger.getKey());
                scheduler.unscheduleJob(cronTrigger.getKey());
                scheduler.deleteJob(jobDetail.getKey());
            }
        } catch (SchedulerException e) {
            e.printStackTrace();
            log.error("觸發器啓動異常", e);
        }
        return extJsObject;
    }

啓動後,控制檯的輸出如下圖:
這裏寫圖片描述
點擊暫停後,也可以停止此任務。
好了,就先簡單的講到這兒了,希望對想使用quartz的童鞋有所幫助!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章