天天看點

Spring整合quartz架構實作任務定時排程

Spring整合quartz架構實作任務定時排程

  1.  首先需要引入需要的jar包,如上圖所示。

       2. 編寫需要定時排程的測試類:   

package com.jp.task;
import java.util.Date;
public class TestTask{    
    private static int counter = 0;   
    protected void execute()  {   
          long ms = System.currentTimeMillis();   
          System.out.println("\t\t" + "========================================"    +     new Date(ms));  
          System.out.println("(" + counter++ + ")");   
      }   
}      

  3.編寫配置檔案classpath:quartz.xml,放在工程的src目錄下:

<?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:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-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/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
  
        <!-- 定義目标bean和bean中的方法 -->
    <bean id="SpringQtzJob" class="com.jp.task.TestTask"/>
    <bean id="SpringQtzJobMethod" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject">
            <ref bean="SpringQtzJob"/>
        </property>
        <property name="targetMethod">  <!-- 要執行的方法名稱 -->
            <value>execute</value>
        </property>
    </bean>

    <!-- ======================== 排程觸發器 ======================== -->
    <bean id="CronTriggerBean" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <property name="jobDetail" ref="SpringQtzJobMethod"></property>
        <property name="cronExpression" value="0/5 * * * * ?"></property>
    </bean>

    <!-- ======================== 排程工廠 ======================== -->
    <bean id="SpringJobSchedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list>
                <ref bean="CronTriggerBean"/>
            </list>
        </property>
    </bean>  
</beans>      

  4.設定Spring啟動時就加載quartz的配置檔案,需要在web.xml中加上下面的代碼:

<listener>
    <description>spring監聽器</description>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  <context-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:bean.xml;classpath:quartz.xml</param-value>
  </context-param>      

  5.關于cronExpression表達式,這裡講解一下,就是第3步配置檔案中的value="0/5 * * * * ?"

秒 0-59 , - * /

分 0-59 , - * /

小時 0-23 , - * /

日期 1-31 , - * ? / L W C

月份 1-12 或者 JAN-DEC , - * /

星期 1-7 或者 SUN-SAT , - * ? / L C #

年(可選) 留白, 1970-2099 , - * /

表達式意義

"0 0 12 * * ?" 每天中午12點觸發

"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 2002-2005" 2002年至2005年的每月的最後一個星期五上午10:15觸發

"0 15 10 ? * 6#3" 每月的第三個星期五上午10:15觸發

每天早上6點

0 6 * * *

每兩個小時

0 */2 * * *

晚上11點到早上8點之間每兩個小時,早上八點

0 23-7/2,8 * * *

每個月的4号和每個禮拜的禮拜一到禮拜三的早上11點

0 11 4 * 1-3

1月1日早上4點

0 4 1 1 *

   6.還要需要多個任務時的情況,參考:http://nesuk.iteye.com/blog/1582557

  關于Spring內建Quartz的concurrent屬性

  以前經常在任務排程程式中使用Spring內建的Quartz,這種方式可以用簡單的聲明式配置即可實作定時任務,并結合了Spring自身的Bean的管理功能,非常友善。配置樣本如下:

<bean id="transmitTask" 
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
    <property name="targetObject">
        <ref bean="transTaskBusiness" />
    </property>
    <property name="targetMethod">
        <value>execute</value>
    </property>
    <property name="concurrent">
        <value>false</value>
    </property>
</bean>      

  其中concurrent屬性辨別的解釋為:對于相同的JobDetail,當指定多個Trigger時,

很可能第一個job完成之前,第二個job就開始了。指定concurrent設為false,多個job不會并發運作,第二個job将不會在第一個job完成之前開始。

  那麼此處的第二個job到底是被推遲執行了,還是被取消了呢?

  今天帶着這個疑問做了一個小實驗,具體做法如下:将任務的Trigger設定為每10秒鐘執行一次,然後在執行的任務體内讓Thread暫停15秒鐘,這樣不同的job之間肯定會有時間上的重疊。當啟動程式之後,發現前一個job執行結束的時刻的秒數為15,而且第二個本來在10s就執行的job馬上就啟動了。

轉載于:https://www.cnblogs.com/lnlvinso/p/4194725.html