歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 整合Spring和Quartz Scheduler

整合Spring和Quartz Scheduler

日期:2017/3/1 10:34:53   编辑:Linux編程

首先認識明確幾個關於Quartz Scheduler的概念。

調度器:負責對用戶定義的所有任務進行調度的類。

觸發器:觸發器在邏輯上包含兩個屬性,即如何觸發該調度器和觸發該調度器之後進行怎麼樣的操作,在Quartz Scheduler中觸發器的觸發事件為特定時間。時間可以為一個時間段,也可以為時間點。

任務(jobDetail:觸發器在被觸發後進行的操作,可以指定任意一個類的某個方法。觸發器被觸發之後將調用該類的指定方法。

在spring.jar包中包含了對Quartz Scheduler進行操作的類:

1. org.springframework.scheduling.quartz.SchedulerFactoryBean

該類負責在spring容器中創建調度器。其最重要的屬性有triggers,這是一個List定義了該調度器負責調度的所有觸發器。還有一個屬性為autoStartup,該類指定是否在spring構造該類完成之後開始執行調度。一般設置為true。

2. org.springframework.scheduling.quartz.CronTriggerBean

該類負責在spring容器中創建一個觸發器,該類的ID應該在某個SchedulerFactoryBean屬性的List中被引用,這樣這個觸發器才能保證被某個指定調度器調度。在該類中應該指定兩個屬性,觸發規則(cronExpression)和觸發要執行任務(jobDetail)。觸發規則(cronExpression)是一個指定規則的字符串,指定了在什麼時候觸發該觸發器。在下文中介紹,jobDetail屬性配置為一個MethodInvokingJobDetailFactoryBean,由MethodInvokingJobDetailFactoryBean負責生成任務類。

3. org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean

該類負責生成具體的任務,其實任務非常簡單,只需要指定某個對象的某個方法即可,在觸發器觸發時,即調用指定對象的指定方法。

代碼示例

spring配置文件

<?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"

xmlns:tx="http://www.springframework.org/schema/tx"

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd

http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd

http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

<!-- 任務調度器生成器,Spring生成具有指定屬性調度器對象 -->

<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">

<!-- 生成的調度器所管理的所有觸發器 -->

<property name="triggers">

<list>

<ref bean="testTrigger" />

</list>

</property>

<property name="autoStartup" value="true" />

</bean>

<!-- 觸發器生成器類,用被指定的調度器調度生成指定規則的觸發器對象 -->

<bean id="testTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">

<!-- 觸發後要做的操作,這個操作由spring管理,只需要指定一個MethodInvokingJobDetailFactoryBean -->

<property name="jobDetail" ref="testJobDetail" />

<!-- 觸發規則,這裡的觸發規則是每隔2秒鐘後觸發一次 -->

<property name="cronExpression" value="*/2 * * * * ?" /><!-- -->

</bean>

<!--任務生成器,由spring管理,只需要指定其對應的對象和方法即可,任務的執行即是某個對象調用一個方法 -->

<bean id="testJobDetail"

class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">

<!-- 指定該任務對應的調用對象,這個對象所屬的類無需實現任何接口-->

<property name="targetObject" ref="testJob" />

<!-- 指定在targetObject對象中某個的方法 -->

<property name="targetMethod" value="execute" />

<!-- 是否允許任務並發執行。當值為false時,表示必須等到前一個線程處理完畢後才再啟一個新的線程 -->

<property name="concurrent" value="false" />

</bean>

<!-- 一個普通的類,用於測試 -->

<bean id="testJob" class="com.javacat.spring.TestJob"/>

</beans>

用於測試的類:

package com.javacat.spring;

import java.util.Date;

public class TestJob {

private static int count = 0;

public void execute() {

try {

Thread.sleep(3000);

System.out.println(new Date() + "--任務I第"+ ++count +"次被觸發");

} catch (Exception ex) {

ex.printStackTrace();

}

}

下面介紹如何在spring中定義觸發器的生成規則:

生成規則cronExpression屬性是一個空格隔開的字符串,每個部分分別標識指定的時間的秒,分,時,日,月,周幾,年屬性。先看一個表格

字段名

允許的值

允許的特殊字符

0-59

- * /

0-59

- * /

0-23

- * /

1-31

- * / L W C ?

1-12 or JAN-DEC

- * /

周幾

1-7(1對應星期天)or SUN-SAT

- * ? / L C #

年(可選字段)

1970-2099 empty

- * /

字符釋義

“?”字符:表示不確定的值

“,”字符:指定數個值

“-”字符:指定一個值的范圍

“/”字符:指定一個值的增加幅度。n/m表示從n開始,每次增加m

“L”字符:用在日表示一個月中的最後一天,用在周表示該月最後一個星期X

“W”字符:指定離給定日期最近的工作日(周一到周五)

“#”字符:表示該月第幾個周X。6#3表示該月第3個周五

Cron表達式范例:

每隔5秒執行一次:*/5 * * * * ?

每隔1分鐘執行一次:0 */1 * * * ?

每天23點執行一次:0 0 23 * * ?

每天凌晨1點執行一次:0 0 1 * * ?

每月1號凌晨1點執行一次:0 0 1 1 * ?

每月最後一天23點執行一次:0 0 23 L * ?

每周星期天凌晨1點實行一次:0 0 1 ? * L

在26分、29分、33分執行一次:0 26,29,33 * * * ?

每天的0點、13點、18點、21點都執行一次:0 0 0,13,18,21 * * ?

Copyright © Linux教程網 All Rights Reserved