SpringMVC整合Quartz實現定時任務和Spring自帶Task定時任務

1、Quartz定時任務
一、引入quartz 
 導入quartz.jar包,或者pom.xml 配置對應的依賴:java

                <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz</artifactId>
            <version>1.8.6</version>
        </dependency> web

二、 Web.xml配置
在Web項目web.xml中配置quartz的配置文件加載路徑:spring

        <servlet>
        <servlet-name>rest</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>
                /WEB-INF/classes/rest-servlet.xml, 
               /WEB-INF/classes/pyc-spring-quartz.xml
            </param-value>
        </init-param> 
        <load-on-startup>1</load-on-startup>
    </servlet> apache

三、寫具體的定時調度的任務:服務器


package andy.test.quartz.schedule;
 
/**  
 * @author Zhang,Tianyou  
 * @version:2014-12-11 下午12:00:24  
 * 
 *  一個測試的打印定時任務
 */
 
public class MyPrintSchedule {
 
    public void printSomething(){
        //內容就是打印一句話
        System.out.println("this is andy schedule");
    }
}架構

四、配置quartz的xml配置信息
    Quartz配置文件名字能夠隨便,需和web.xml中的一致。學習

     pyc-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-3.0.xsd">
    <!-- 添加調度的任務bean 配置對應的class-->
    <bean id="myPrintSchedule" class="andy.test.quartz.schedule.MyPrintSchedule" />
 
    <!--配置調度具體執行的方法-->
    <bean id="myPrintDetail"
        class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject" ref="myPrintSchedule" />
        <property name="targetMethod" value="printSomething" />
        <property name="concurrent" value="false" />
    </bean>
 
    <!--配置調度執行的觸發的時間-->
    <bean id="myPrintTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
        <property name="jobDetail" ref="myPrintDetail" />
        <property name="cronExpression">
            <!-- 天天早上8點執行任務調度 -->
            <value>0 0 8 * * ?</value>
        </property>
    </bean>
 
    
 
    <!-- quartz的調度工廠 調度工廠只能有一個,多個調度任務在list中添加 -->
    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list>
                 <!-- 全部的調度列表-->
                <ref local="myPrintTrigger" />
                
            </list>
        </property>
    </bean>
</beans> this

 

這樣就實現了myPrint的任務調度,執行時間是天天早上8點執行一次,打印:
     this is andy schedulespa

這句話。

quartz的功能是很是強大的,使用也很是的簡單方便,有事須要web啓動時,執行一些初始化的任務,這是咱們執行配置對應的執行調度的觸發時間就能完成。其具體實現以下:

 <!--配置調度執行的觸發的時間-->
    <bean id="myPrintTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
        <property name="jobDetail" ref="myPrintDetail" />
        <property name="cronExpression">
            <!-- 不重複計數,只執行一次 -->
            <property name="repeatCount" value="0" />
        </property>
    </bean> 

上面的配置完成了,服務器啓動執行的任務。只被執行一次。


2、Spring自帶的任務Task


   Spring自帶的定時任務是在spring3以後支持,相比於quartz定時任務Spring相對於簡單,配置也很簡單。quartz功能比Spring Task強大,支持集羣功能。

  一、在spring配置中添加task的schema
    

    pring配置文件頭中添加命名空間及描述

       

 <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    
    //....其餘
    
    xmlns:task="http://www.springframework.org/schema/task" 
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-4.1.xsd 
        
        //.....其餘
        
        http://www.springframework.org/schema/task
        http://www.springframework.org/schema/task/spring-task-4.1.xsd"> 

二、開啓掃描定時任務包


 <context:component-scan base-package="org.andy.task" /> 

三、配置開啓任務


 <task:annotation-driven /> 

  若是任務比較多,能夠添加任務池


 <task:scheduler id="scheduler" pool-size="5" />
<task:annotation-driven executor="executor" scheduler="scheduler" />


    若是定時任務不少,能夠配置executor線程池,這裏executor的含義和java.util.concurrent.Executor是同樣的,pool-size的大小官方推薦爲5~10。scheduler的pool-size是ScheduledExecutorService線程池 


四、Spring的POJO任務類


package org.andy.task;
 
import org.apache.log4j.Logger;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
 
/**
 * 建立時間:2016年5月12日 下午3:48:38
 * 
 * @author andy
 * @version 2.2
 */
@Component("taskJob")
public class TaskJob {
 
    private static final Logger LOG = Logger.getLogger(TaskJob.class);
    
    //每分鐘的10秒執行
    @Scheduled(cron = "10 * * * * ?")
    public void job1(){
        LOG.info("hello。。。。"); 
    }
    
    //每10秒執行一次
    @Scheduled(fixedRate = 1000 * 1) 
    public void job(){
        LOG.info("world");
    }
}


3、定時配置
   spring的task和quartz的任務格式都是同樣的。

Cron表達式包括下面7個字段並區別順序:秒0-59,分0-59,小時0-23,月內日期1-31,月1-12或者JAN-DEC,周內日期1-7或者SUN-SAT,年(可選字段)留空或者1970-2099而且經過特殊字符表示特殊意義,具體爲下:
    斜線(/)字符表示增量值。例如,在秒字段中"5/15"表明從第5秒開始,每15秒一次。
    問號(?)字符和字母L字符只有在月內日期和周內日期字段中可用。問號表示這個字段不包含具體值。因此,若是指定月內日期,能夠在周內日期字段中插入"?",表示周內日期值可有可無。這裏有個很蛋疼的設定,無關Quartz,而是Spring集成Quartz後,它本身加的一個約束,那就是:日期(1-31)和星期(SUN-SAT)二者,必須有一個是問號(?),系統在啓動的時候,Spring會檢查表達式,若是不符合它的規則,就會拋異常。因此在使用的時候這個地方必定要注意,而這個在Linux上執行Cron是沒有這個限制的。
    字母L字符是last的縮寫。放在月內日期字段中,表示安排在當月最後一天執行。在周內日期字段中,若是"L"單獨存在,就等於"7",不然表明當月內周內日期的最後一個實例。因此"0L"表示安排在當月的最後一個星期日執行。
    字母(W)字符把執行安排在最靠近指定值的工做日。把"1W"放在月內日期字段中,表示把執行安排在當月的第一個工做日內。
    井號(#)字符爲給定月份指定具體的工做日實例。把"MON#2"放在周內日期字段中,表示把任務安排在當月的第二個星期一。
    星號(*)字符是通配字符,表示該字段能夠接受任何可能的值、表達式例子。
    例子:


    "0 0 08 * * ?" 天天上午8點觸發
    "0 15 10 ? * *" 天天上午10:15觸發
    "0 15 10 * * ?" 天天上午10:15觸發
    "0 15 10 * * ? *" 天天上午10:15觸發
    "0 15 10 * * ? 2005" 2005年的天天上午10:15觸發
    "0 * 14 * * ?" 在天天下午2點到下午2:59期間的每1分鐘觸發
    "0 0/5 14 * * ?" 在天天下午2點到下午2:55期間的每5分鐘觸發
    "0 0/5 14-18 * * ?" 在天天下午2點到2:55期間和下午6點到6:55期間的每5分鐘觸發
    "0 0-5 14 * * ?" 在天天下午2點到下午2:05期間的每1分鐘觸發
    "0 10,44 14 ? 3 WED" 每一年三月的星期三的下午2:10和2:44觸發
    "0 15 10 ? * MON-FRI" 週一至週五的上午10:15觸發
    "0 15 10 15 * ?" 每個月15日上午10:15觸發
    "0 15 10 L * ?" 每個月最後一日的上午10:15觸發
    "0 15 10 ? * 6L" 每個月的最後一個星期五上午10:15觸發
    "0 15 10 ? * 6L 2009-2019" 2009年至2019年的每個月的最後一個星期五上午10:15觸發
    "0 15 10 ? * 6#3" 每個月的第三個星期五上午10:15觸發

感興趣的能夠本身來個人Java架構羣,能夠獲取免費的學習資料,羣號:855801563對Java技術,架構技術感興趣的同窗,歡迎加羣,一塊兒學習,相互討論。

相關文章
相關標籤/搜索