項目中經(jīng)常會用到定時任務(wù)旧巾,有的人在用quartz耸序,有的人可能自己搭建了一套調(diào)度平臺,springboot對于定任務(wù)的支持鲁猩,讓定時任務(wù)的創(chuàng)建變得簡單佑吝,今天來說說springboot中定時任務(wù)的創(chuàng)建。
springboot中定時任務(wù)的創(chuàng)建
springboot定時任務(wù)的創(chuàng)建绳匀,這里就主要說兩種方式
- 通過注解創(chuàng)建
- 通過springboot中提供的接口實現(xiàn)
springboot通過注解創(chuàng)建定時任務(wù)
首先引入pom
在類上主要用到了@EnableScheduling注解芋忿,都在org.springframework:spring-context這個包下
就引入org.springframework:spring-context這個包就可以使用了
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
直接上代碼來一個栗子
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* @createdTime: 2020/4/7 16:00.
* @version: 1.0 .
*/
//在類型使用@EnableScheduling來開啟定時任務(wù)
@Component
@EnableScheduling
public class TestTask {
private static ThreadLocal<SimpleDateFormat> dateFormat =
ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
//在方法上使用@Scheduled注解來創(chuàng)建具體的定時任務(wù)
@Scheduled(cron = "0/10 * * * * ?")
private void task1() {
System.err.println("執(zhí)行定時任務(wù)了,執(zhí)行時間為:" + dateFormat.get().format(new Date()));
}
}
看下執(zhí)行結(jié)果:
在類上使用了@EnableScheduling來開啟定時任務(wù)疾棵,使用了@Component是為了注入到spring容器中戈钢,這里不用@Component會不會注入我倒沒有試過,有試過的小伙伴可以說一下是尔。
在具體需要定時執(zhí)行的方法上殉了,使用 @Scheduled注解,這個注解里面的參數(shù)有很多種拟枚,我這用了cron表達(dá)式薪铜,這里介紹下這個注解的參數(shù)吧
@Scheduled注解的各個參數(shù)
- cron
使用方式:@Scheduled(cron = "0/10 * * * * ?")
源碼定義:String cron() default "";
說明:cron表達(dá)式,就是我們?nèi)粘S玫腸ron恩溅,具體的就不貼出來了 - zone
使用方式:@Scheduled(zone = "GMT+08:00")
源碼定義:String zone() default "";
說明:時區(qū)隔箍,cron表達(dá)式會基于這個時區(qū)解析,默認(rèn)為空脚乡,會取應(yīng)用所在服務(wù)器的時區(qū)蜒滩,一般不填就可以了,和jdk中TimeZone用的是統(tǒng)一體系奶稠,就不具體說了 - fixedDelay
使用方式:@Scheduled(fixedDelay = 1)
源碼定義:long fixedDelay() default -1;
說明:上次執(zhí)行完了俯艰,相隔多長時間以后再執(zhí)行,單位是毫秒 - fixedDelayString
使用方式:
@Scheduled(fixedDelayString = "1")
@Scheduled(fixedDelayString = "${配置文件里面的值}")
源碼定義:String fixedDelayString() default "";
說明:和fixedDelay一樣锌订,是string類型的可以填數(shù)竹握,單位是毫秒,可以使用配置文件里面的值辆飘,使用方法和spring注入配置文件的使用方式一樣 - fixedRate
使用方式:@Scheduled(fixedRate = 1)
源碼定義:long fixedRate() default -1;
說明:上次執(zhí)行開始后啦辐,相隔多長時間以后再執(zhí)行污秆,單位是毫秒 - fixedRateString
使用方式:
@Scheduled(fixedRateString = "1")
@Scheduled(fixedRateString = "${配置文件里面的值}")
源碼定義:String fixedRateString() default "";
說明:和fixedRate一樣,昧甘,是string類型的可以填數(shù)良拼,單位是毫秒,可以使用配置文件里面的值充边,使用方法和spring注入配置文件的使用方式一樣 - initialDelay
使用方式:@Scheduled(initialDelay = 1)
源碼定義:long initialDelay() default -1;
說明:上第一次執(zhí)行后庸推,相隔多長時間以后再執(zhí)行,單位是毫秒 - initialDelayString
使用方式:
@Scheduled(initialDelayString = "1")
@Scheduled(initialDelayString = "${配置文件里面的值}")
源碼定義:String initialDelayString() default "";
說明:和initialDelay一樣浇冰,贬媒,是string類型的可以填數(shù),單位是毫秒肘习,可以使用配置文件里面的值际乘,使用方法和spring注入配置文件的使用方式一樣
springboot通過注接口創(chuàng)建定時任務(wù)
通過接口創(chuàng)建定時,就會比較靈活漂佩,定時cron表達(dá)式就不用寫死在代碼的注解上了脖含,可以通過存儲到數(shù)據(jù)庫等存儲系統(tǒng)中,在接口中來獲取這個配置的表達(dá)式投蝉,這樣可以實現(xiàn)一個簡易的任務(wù)調(diào)度平臺养葵,通過數(shù)據(jù)庫配置就可以管理定時任務(wù)的執(zhí)行
實現(xiàn)接口SchedulingConfigurer
主要用的是這個接口SchedulingConfigurer,他是org.springframework.scheduling.annotation.SchedulingConfigurer這個包路徑瘩缆,其實也是都在org.springframework:spring-context這個包下
就引入org.springframework:spring-context這個包就可以使用了
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
主要方法
復(fù)寫configureTasks方法关拒,這個方法通過ScheduledTaskRegistrar來添加定時任務(wù),大致看方法庸娱,入?yún)⒒臼且粋€線程對象着绊,后面那個參數(shù)和注解里面一樣,主要有cron表達(dá)式熟尉,delay上次執(zhí)行完了归露,相隔多長時間以后再執(zhí)行,initial什么的就不一一贅述了
直接上代碼來一個栗子
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.config.Task;
import org.springframework.stereotype.Component;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* @createdTime: 2020/4/7 18:33.
* @version: 1.0 .
*/
@Component
@EnableScheduling
public class TestTask2 implements SchedulingConfigurer {
private static ThreadLocal<SimpleDateFormat> dateFormat =
ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
/**
* Callback allowing a {@link TaskScheduler
* TaskScheduler} and specific {@link Task Task}
* instances to be registered against the given the {@link ScheduledTaskRegistrar}.
*
* @param taskRegistrar the registrar to be configured.
*/
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
System.err.println("假裝從數(shù)據(jù)庫中獲取到了配置好的定時任務(wù)執(zhí)行計劃");
String cron = "0/10 * * * * ?";
taskRegistrar.addCronTask(() -> {
System.err.println("接口定時任務(wù)執(zhí)行定時任務(wù)了臣樱,執(zhí)行時間為:" + dateFormat.get().format(new Date()));
},cron);
}
}
這里通過重寫configureTasks方法靶擦,使用ScheduledTaskRegistrar對象來創(chuàng)建定時任務(wù),然后表達(dá)式可以從數(shù)據(jù)庫等地方讀取雇毫,演示時候就不寫那塊代碼了,這樣可以很簡單的實現(xiàn)出來一個簡單的任務(wù)調(diào)度平臺
看下執(zhí)行結(jié)果:
springboot創(chuàng)建定時任務(wù)就為大家說到這里踩蔚,歡迎大家來交流棚放,指出文中一些說錯的地方,讓我加深認(rèn)識馅闽。
謝謝大家飘蚯!