一、背景
最近專案中需要使用到定時任務進行庫存佔用釋放的需求,就總結了如何使用Spring Task進行簡單配置完成該需求,本文介紹Spring3.0以後自定義開發的定時任務工具,
spring task,我們可以將它比作一個輕量級的Quartz,使用簡單方便,除spring相關的包外不需要額外的包,而且支援註解和配置檔案兩種形式,下面我會分別介紹這兩種方式。
二、定時任務開發步驟
開發環境
- Spring 4.2.6.RELEASE
- Maven 3.3.9
- JDK 1.7
- Idea 15.04
【1】.基於配置檔案
1.編寫普通java class
package com.hafiz.www.cron; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Desc:第一個基於SpringTask的排程任務 * Created by hafiz.zhang on 2016/12/11. */ public class FirstCron { private static final Logger logger = LoggerFactory.getLogger(FirstCron.class); public void cron() { logger.info("定時任務進行中......."); // do something else } }
2.在spring配置檔案頭中新增名稱空間及描述(下面加粗處)並配置定時任務
1 <beans xmlns="http://www.springframework.org/schema/beans" 2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xmlns:task="http://www.springframework.org/schema/task" 4 xsi:schemaLocation="http://www.springframework.org/schema/beans 5 http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 6 http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd"> 7 8 <bean id="firstCron" class="com.hafiz.www.cron.FirstCron"/> 9 <task:scheduled-tasks> 10 <task:scheduled ref="firstCron" method="cron" cron="0/5 * * * * ?"/> 11 </task:scheduled-tasks> 12 </beans>
我們設定每5秒鐘執行一次。關於Spring Task 的 cron表示式,請參見另一篇部落格:擺脫Spring 定時任務的@Scheduled cron表示式的困擾
【2】基於註解
我們可以使用@Scheduled註解進行開發,首先我們看下,該註解的原始碼
1 package org.springframework.scheduling.annotation; 2 3 import java.lang.annotation.Documented; 4 import java.lang.annotation.ElementType; 5 import java.lang.annotation.Repeatable; 6 import java.lang.annotation.Retention; 7 import java.lang.annotation.RetentionPolicy; 8 import java.lang.annotation.Target; 9 import org.springframework.scheduling.annotation.Schedules; 10 11 @Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE}) 12 @Retention(RetentionPolicy.RUNTIME) 13 @Documented 14 @Repeatable(Schedules.class) 15 public @interface Scheduled { 16 String cron() default ""; 17 18 String zone() default ""; 19 20 long fixedDelay() default -1L; 21 22 String fixedDelayString() default ""; 23 24 long fixedRate() default -1L; 25 26 String fixedRateString() default ""; 27 28 long initialDelay() default -1L; 29 30 String initialDelayString() default ""; 31 }
可以看出該註解有五個方法或者叫引數,分別表示的意思是:
- cron:指定cron表示式
- zone:官方文件解釋:A time zone for which the cron expression will be resolved。指定cron表示式執行的時區
- fixedDelay:官方文件解釋:An interval-based trigger where the interval is measured from the completion time of the previous task. The time unit value is measured in milliseconds.即表示從上一個任務完成開始到下一個任務開始的間隔,單位是毫秒。
- fixedRate:官方文件解釋:An interval-based trigger where the interval is measured from the start time of the previous task. The time unit value is measured in milliseconds.即從上一個任務開始到下一個任務開始的間隔,單位是毫秒。
- initialDelay:官方文件解釋:Number of milliseconds to delay before the first execution of a
fixedRate()
orfixedDelay()
task.任務第一次被呼叫前的延時,單位毫秒
1.首先編寫註解的定時任務類
1 package com.hafiz.www.cron; 2 3 import org.slf4j.Logger; 4 import org.slf4j.LoggerFactory; 5 import org.springframework.scheduling.annotation.Scheduled; 6 7 /** 8 * Desc:第一個基於SpringTask的排程任務 9 * Created by hafiz.zhang on 2016/12/11. 10 */ 11 public class FirstCron { 12 private static final Logger logger = LoggerFactory.getLogger(FirstCron.class); 13 14 @Scheduled(cron = "0/5 * * * * ?") 15 public void cron() { 16 logger.info("定時任務進行中......."); 17 // do something else 18 } 19 }
2.在spring配置檔案頭中新增名稱空間及描述(下面加粗處)並開啟定時任務註解驅動
1 <beans xmlns="http://www.springframework.org/schema/beans" 2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xmlns:task="http://www.springframework.org/schema/task" 4 xsi:schemaLocation="http://www.springframework.org/schema/beans 5 http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 6 http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd"> 7 8 <bean id="firstCron" class="com.hafiz.www.cron.FirstCron"/> 9 <task:scheduler id="qbScheduler" pool-size="10"/> 10 <task:annotation-driven scheduler="qbScheduler" mode="proxy"/> 11 <!--簡單來說,我們只需要<task:annotation-driven/>這一句即可,這些引數不是必須的 --> 12 </beans>
以上我們就完成了基於註解的定時任務的開發,是不是很簡單?
執行結果:
三、總結
其實有些知識我們表面上看起來很難,但是當我們實際操作的時候,發現挺簡單的,只要遇到問題我們勤思考多思考,就一定會有解決辦法。關於定時任務,還有一種基於Spring Quartz的實現,以後有需要,我們再進行介紹。歡迎留言交流.......