Spring Task定時任務(wù)使用
Spring Task 定時任務(wù)
在項目開發(fā)中,經(jīng)常需要定時任務(wù)來幫助我們來做一些內(nèi)容,比如定時派息、跑批對賬、業(yè)務(wù)監(jiān)控等。
實(shí)現(xiàn)定時任務(wù)有 3 種方式:
- java 自帶的 API:java.util.Timer 類和 java.util.TimerTask 類;
- Quartz 框架:開源 功能強(qiáng)大 使用起來稍顯復(fù)雜;
- Spring 3.0 以后自帶了 task 調(diào)度工具,也稱 Spring Task,它比 Quartz 更加的簡單方便。
pom 包配置
pom 包里面只需要引入 SpringBoot Starter 包即可,SpringBoot Starter 包中已經(jīng)內(nèi)置了定時的方法。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency>
啟動類開啟定時
在啟動類上面加上 @EnableScheduling 即可開啟定時:
@SpringBootApplication @EnableScheduling public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
創(chuàng)建定時任務(wù)實(shí)現(xiàn)類
使用 SpringBoot 自帶的定時非常的簡單,只需要在方法上面添加 @Scheduled 注解即可。
定時任務(wù) 1:
@Component public class SchedulerTask { private static final Logger log = LoggerFactory.getLogger(SchedulerTask.class); private int count = 0; @Scheduled(cron="*/6 * * * * ?") private void process() { log.info("{}", "this is scheduler task running " + (count++)); } }
設(shè)置 process()
每隔六秒執(zhí)行一次,并統(tǒng)計執(zhí)行的次數(shù)。
我們還有另外的一種方案來設(shè)置,固定時間周期執(zhí)行方法。
定時任務(wù) 2:
@Component public class Scheduler2Task { private static final Logger log = LoggerFactory.getLogger(Scheduler2Task.class); private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); @Scheduled(fixedRate = 6000) public void reportCurrentTime() { log.info("{}", "現(xiàn)在時間:" + dateFormat.format(new Date())); } }
啟動項目之后,就會在控制臺看到打印的結(jié)果。
結(jié)果如下:
INFO [ scheduling-1] com.example.timingtask.Scheduler2Task : 現(xiàn)在時間:20:12:02
INFO [ scheduling-1] com.example.timingtask.SchedulerTask : this is scheduler task running 0
INFO [ scheduling-1] com.example.timingtask.Scheduler2Task : 現(xiàn)在時間:20:12:08
INFO [ scheduling-1] com.example.timingtask.SchedulerTask : this is scheduler task running 1
INFO [ scheduling-1] com.example.timingtask.Scheduler2Task : 現(xiàn)在時間:20:12:14
INFO [ scheduling-1] com.example.timingtask.SchedulerTask : this is scheduler task running 2
說明兩個方法都按照固定 6 秒的頻率來執(zhí)行。
參數(shù)說明
@Scheduled 參數(shù)可以接受兩種定時的設(shè)置
- 一種是我們常用的
cron="*/6 * * * * ?"
- 一種是
fixedRate = 6000
兩種都可表示固定周期執(zhí)行定時任務(wù)。
fixedRate 說明:
- @Scheduled(fixedRate = 6000) : 上一次開始執(zhí)行時間點(diǎn)之后 6 秒再執(zhí)行。
- @Scheduled(fixedDelay = 6000) : 上一次執(zhí)行完畢時間點(diǎn)之后 6 秒再執(zhí)行。
- @Scheduled(initialDelay=1000, fixedRate=6000) : 第一次延遲 1 秒后執(zhí)行,之后按 fixedRate 的規(guī)則每 6 秒執(zhí)行一次。
cron 說明:
- 用來配置定時任務(wù)的時間表達(dá)式,通常用于在Unix/Linux系統(tǒng)中設(shè)置定時任務(wù)。
- 在Java應(yīng)用程序中,Cron表達(dá)式也被廣泛使用,比如在Quartz調(diào)度框架中用來配置定時任務(wù)的觸發(fā)時間。
- Cron表達(dá)式由7個字段組成,分別表示秒、分鐘、小時、日期、月份、星期和年(可選)。
- 每個字段可以包含多個取值,以逗號分隔,或者可以使用通配符和范圍來表示時間。
以下是Cron表達(dá)式的基本格式:
plaintext 秒 分 時 日 月 星期 年 其中,各字段的取值范圍如下:
- 秒(0-59)、分鐘(0-59)、小時(0-23)、日期(1-31)、月份(1-12或者 JAN-DEC) 星期(0-7或者 SUN-SAT,0和7都代表星期日)、年(可選,留空表示每年)。
以下是一些常見的Cron表達(dá)式示例:
0 0 12 * * ?
:每天中午12點(diǎn)觸發(fā)0 0/5 * * * ?
:每隔5分鐘觸發(fā)0 0 8-10 * * ?
:每天上午8點(diǎn)至10點(diǎn)之間每小時觸發(fā)0 0 6,18 * * ?
:每天早上6點(diǎn)和晚上6點(diǎn)觸發(fā)0 0 9 ? * MON-FRI
:周一至周五的早上9點(diǎn)觸發(fā)
并行任務(wù)
了解:
之前的的定時任務(wù)都是串行執(zhí)行的。所謂串行執(zhí)行指的是只由一個線程來執(zhí)行任務(wù)。
除了這種方式 Spring Task 還支持并行執(zhí)行任務(wù),即由多個線程來執(zhí)行不同的任務(wù)。
要實(shí)現(xiàn)這樣的功能,你需要去進(jìn)行額外的配置:
@Configuration @EnableScheduling public class TimingTaskConfig implements SchedulingConfigurer, AsyncConfigurer { // 線程池線程數(shù)量 private static final int corePoolSize = 5; @Bean public ThreadPoolTaskScheduler taskScheduler() { ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler(); scheduler.initialize(); // 初始化線程池 scheduler.setPoolSize(corePoolSize); // 線程池容量 return scheduler; } @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { taskRegistrar.setTaskScheduler(taskScheduler()); } @Override public Executor getAsyncExecutor() { return taskScheduler(); } @Override public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() { return null; } }
注意,這時 @EnableScheduling
注解標(biāo)注在了這個配置類上,因此,Spring Boot 的入口類上就不再需要標(biāo)注它了。(當(dāng)然,你硬要把它標(biāo)注在入口類上其實(shí)也可以)。
其它的相關(guān)代碼無需修改,運(yùn)行項目你會看到類似如下的日志輸出:
INFO [taskScheduler-1] com.example.timingtask.Scheduler2Task : 現(xiàn)在時間:20:08:57
INFO [taskScheduler-1] com.example.timingtask.SchedulerTask : this is scheduler task running 0
INFO [taskScheduler-2] com.example.timingtask.Scheduler2Task : 現(xiàn)在時間:20:09:03
INFO [taskScheduler-3] com.example.timingtask.SchedulerTask : this is scheduler task running 1
INFO [taskScheduler-1] com.example.timingtask.Scheduler2Task : 現(xiàn)在時間:20:09:09
INFO [taskScheduler-4] com.example.timingtask.SchedulerTask : this is scheduler task running 2
總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java并發(fā)工具類LongAdder原理實(shí)例解析
這篇文章主要介紹了Java并發(fā)工具類LongAdder原理實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-05-05org.springframework.dao.OptimisticLockingFailureException樂觀鎖
本文主要介紹了org.springframework.dao.OptimisticLockingFailureException樂觀鎖失敗的解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-05-05Spring詳細(xì)講解FactoryBean接口的使用
這篇文章主要為大家介紹了Spring容器FactoryBean工廠實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06Spring boot從安裝到交互功能實(shí)現(xiàn)零基礎(chǔ)全程詳解
這篇文章主要介紹了Spring boot從安裝到交互功能得實(shí)現(xiàn)全程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07java使用Hex編碼解碼實(shí)現(xiàn)Aes加密解密功能示例
這篇文章主要介紹了java使用Hex編碼解碼實(shí)現(xiàn)Aes加密解密功能,結(jié)合完整實(shí)例形式分析了Aes加密解密功能的定義與使用方法,需要的朋友可以參考下2017-01-01Jedis出現(xiàn)connection timeout問題解決方法(JedisPool連接池使用實(shí)例)
這篇文章主要介紹了Jedis出現(xiàn)connection timeout問題解決方法,使用Jedis的JedisPool連接池解決了這個問題,需要的朋友可以參考下2014-05-05