dubbo2.5-spring4-mybastis3.2-springmvc4-mongodb3.4-redis3.2整合(九)之spring中定時器quartz的整合

請叫我東子發表於2017-02-08

版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/u010046908/article/details/54930240

今天來總結一下。Spring中quartz的使用。

1、Quartz是什麼?

Quartz 是一個開源的作業排程框架,它完全由 Java 寫成,並設計用於 J2SE 和 J2EE 應用中。它提供了巨大的靈活性而不犧牲簡單性。你能夠用它來為執行一個作業而建立簡單的或複雜的排程。

2、Quartz的分類

2.1、按照作業類的繼承方式來分,可以分為兩類

  1. 作業類需要繼承自特定的作業類基類,如Quartz中需要繼承自org.springframework.scheduling.quartz.QuartzJobBean;java.util.Timer中需要繼承自java.util.TimerTask。
  2. 作業類即普通的java類,不需要繼承自任何基類。

注意:推薦使用第二種方式,因為這樣所以的類都是普通類,不需要事先區別對待。

2.2、按照任務排程的觸發時機來分,這裡主要是針對作業使用的觸發器,主要有以下兩種:

  1. 每隔指定時間則觸發一次,在Quartz中對應的觸發器為:org.springframework.scheduling.quartz.SimpleTriggerBean

  2. 每到指定時間則觸發一次,在Quartz中對應的排程器為:org.springframework.scheduling.quartz.CronTriggerBean

注意:並非每種任務都可以使用這兩種觸發器,如java.util.TimerTask任務就只能使用第一種。Quartz和spring task都可以支援這兩種觸發條件。

3、新增Quartz依賴

<!-- 定時器的使用 -->
            <dependency>
                <groupId>org.quartz-scheduler</groupId>
                <artifactId>quartz</artifactId>
                <version>2.2.3</version>
            </dependency>

4、Spring中quartz的使用(作業類即普通的java類的使用)

4.1、定義作業類

package com.lidong.dubbo.core.util.quartz;

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

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @專案名稱:lidong-dubbo
 * @類名:SpringQtz
 * @類的描述: 作業類的排程
 * @作者:lidong
 * @建立時間:2017/2/8 下午5:41
 * @公司:chni
 * @QQ:1561281670
 * @郵箱:lidong1665@163.com
 */
public class SpringQtz  {  

    static Logger  logger = LoggerFactory.getLogger(SpringQtz.class);
    private static int counter = 0;

    /**
     * 排程的方法
     */
    public   void execute()  {
        long ms = System.currentTimeMillis();  
        logger.info(new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date(ms))+"  "+"(" + counter++ + ")");  
    }  
}  

4.2、在Spring中配置作業類

<!-- 要呼叫的工作類 -->
    <bean id="SpringQtzJob" class="com.lidong.dubbo.core.util.quartz.SpringQtz" />

4.3 、定義呼叫物件和方法

<!-- 定義呼叫物件和呼叫物件的方法 -->
    <bean id="SpringQtzJobMethod"
        class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <!-- 呼叫的類 -->
        <property name="targetObject">
            <ref bean="SpringQtzJob" />
        </property>
        <!-- 要執行的方法名稱 -->
        <property name="targetMethod">
            <value>execute</value>
        </property>
    </bean>

4.4、配置排程觸發器

<!-- ======================== 排程觸發器 ======================== -->
    <bean id="CronTriggerBean"
        class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <!--作業詳情 -->
        <property name="jobDetail" ref="SpringQtzJobMethod"></property>
        <!-- cron表示式 -->
        <property name="cronExpression" value="0/10 * * * * ?"></property>
    </bean>

4.5、配置排程工廠

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

5、quartz的cron 表示式

一個cron表示式至少有6個,是按照空格來分割的時間元素。
按照順序為:

  1. 秒 0-59
  2. 分鐘 0-59
  3. 小時 0-23
  4. 天 (月)1-31
  5. 月 0-31
  6. 天 (星期)1-7
  7. 年份 1970- 遞增

    給幾個例子:


"30 * * * * ?" 每半分鐘觸發任務
"30 10 * * * ?" 每小時的1030秒觸發任務
"30 10 1 * * ?" 每天11030秒觸發任務
"30 10 1 20 * ?" 每月2011030秒觸發任務
"30 10 1 20 10 ? *" 每年102011030秒觸發任務
"30 10 1 20 10 ? 2011" 2011102011030秒觸發任務
"30 10 1 ? 10 * 2011" 201110月每天11030秒觸發任務
"30 10 1 ? 10 SUN 2011" 201110月每週日11030秒觸發任務
"15,30,45 * * * * ?"15秒,30秒,45秒時觸發任務
"15-45 * * * * ?" 1545秒內,每秒都觸發任務
"15/5 * * * * ?" 每分鐘的每15秒開始觸發,每隔5秒觸發一次
"15-30/5 * * * * ?" 每分鐘的15秒到30秒之間開始觸發,每隔5秒觸發一次
"0 0/3 * * * ?" 每小時的第00秒開始,每三分鐘觸發一次
"0 15 10 ? * MON-FRI" 星期一到星期五的10150秒觸發任務
"0 15 10 L * ?" 每個月最後一天的10150秒觸發任務
"0 15 10 LW * ?" 每個月最後一個工作日的10150秒觸發任務
"0 15 10 ? * 5L" 每個月最後一個星期四的10150秒觸發任務
"0 15 10 ? * 5#3" 每個月第三週的星期四的10150秒觸發任務

基本上就這麼多了。

程式碼地址:


相關文章