1. 程式人生 > >SSM整合系列之 整合Quartz簡單實現任務排程

SSM整合系列之 整合Quartz簡單實現任務排程

1.摘要:Quartz是Java領域的開源任務排程工具,是一個任務排程框架,通過觸發器設定作業的定時執行規則,來執行定時任務。在專案中使用頻繁,本文將在SSM整合專案上整合Quartz框架實現任務排程。
基礎專案的搭建參考文章:https://blog.csdn.net/caiqing116/article/details/84573166
專案git地址:https://github.com/gitcaiqing/SSM_DEMO.git
2.專案搭建
(1)Maven引入需要的Quartz相關jar包

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

(2)新增spring–>application-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"
	xmlns:context="http://www.springframework.org/schema/context" 
	xsi:schemaLocation="
		http://www.springframework.org/schema/beans
		http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
		http://www.springframework.org/schema/context 
		http://www.springframework.org/schema/context/spring-context-4.1.xsd"
		default-lazy-init="true"> 
		
	<!-- 密碼過期提醒任務排程 -->
	<bean id="jobPasswordExpired" class="com.ssm.quartz.PasswordExpiredQuartz" /> 
	<bean id="jobPasswordExpiredDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">  
	    <property name="targetObject" ref="jobPasswordExpired" />
	    <property name="targetMethod" value="doTask" /> 
	    <!-- 是否支援併發 true 支援; false不支援,等上一個排程任務執行完才會執行,如果間隔時間小於任務執行時間第二個排程任務啟動但會推遲執行 -->
	    <property name="concurrent" value="false" /> 
	 </bean>
	<bean id="jobPasswordExpiredTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">  
        <property name="jobDetail" ref="jobPasswordExpiredDetail" />  
        <!-- 每隔30秒執行一次:0 */30 * * * ? -->
        <property name="cronExpression" value="*/30 * * * * ?"/>
	</bean>
	
	<!--  總管理類如果將lazy-init='false'那麼容器啟動就會執行排程程式   -->  
	<bean id="startQuertz" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" lazy-init="true" >  
        <property name="triggers"> 
            <!-- 作業排程器,list下可加入其他的排程器 -->
            <list>  
             	<ref bean="jobPasswordExpiredTrigger" />
            </list>
	    </property>
	</bean>
	
</beans>

(3)任務排程實現com.ssm.quartz.PasswordExpiredQuartz .java

package com.ssm.quartz;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 密碼過期任務排程
 * @author https://blog.csdn.net/caiqing116
 */
public class PasswordExpiredQuartz {
	
	private static final Logger log = LoggerFactory.getLogger(PasswordExpiredQuartz.class);

	public void doTask() {
		log.info("密碼過期提醒任務排程開始執行");
		//查詢使用者表資料更新時間大於一定天數的 TODO
		//給使用者傳送簡訊或郵件 TODO
		log.info("密碼過期提醒任務排程執行結束");
	}
}

(4)關鍵屬性concurrent詳解
在上文中可以看到設定了屬性concurrent如果需要支援併發則配置為

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

不支援配置為

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

這裡對此屬性說明:對於相同的Job, 很可能第一個job完成之前,第二個job就開始了。指定concurrent設為false,第一個及後續的job不會併發執行,第二個job將不會在第一個job完成之前開始。那麼第二個job是按時啟動了然後被推遲執行還是被取消了呢?這裡呢,我們可以將上文中的排程任務實現執行過程中暫停40s,這樣兩個job之間將會有時間重疊,測試後發現第一個job執行完第二個job馬上啟動了。結論:第二個job是按時啟動了然後被推遲執行
(5)cron表示式詳解大全
Cron的表示式被用來配置CronTrigger例項。 cron的表示式是字串

1.        Seconds
2.        Minutes
3.        Hours
4.        Day-of-Month
5.        Month
6.        Day-of-Week
7.        Year (可選欄位)

每一個欄位都有一套可以指定有效值,如
Seconds (秒) :可以用數字0-59 表示,
Minutes(分) :可以用數字0-59 表示,
Hours(時) :可以用數字0-23表示,
Day-of-Month(天) :可以用數字1-31 中的任一一個值,但要注意一些特別的月份
Month(月) :可以用0-11 或用字串 “JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV and DEC” 表示
Day-of-Week(每週):可以用數字1-7表示(1 = 星期日)或用字元口串“SUN, MON, TUE, WED, THU, FRI and SAT”表示

“/”:為特別單位,表示為“每”如“0/15”表示每隔15分鐘執行一次,“0”表示為 從“0”分開始, “3/20”表示表示每隔20分鐘執行一次,“3”表示從第3分鐘開始執行
“?”:表示每月的某一天,或第周的某一天
“L”:用於每月,或每週,表示為每月的最後一天,或每個月的最後星期幾如“6L”表示“每月的最後一個星期五”
“W”:表示為最近工作日,如“15W”放在每月(day-of-month)欄位上表示為“到本月15日最近的工作日”
““#”:是用來指定“的”每月第n個工作日,例 在每週(day-of-week)這個欄位中內容為"6#3" or “FRI#3” 則表示“每月第三個星期五”

範例大全

每隔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 * * ?