貴陽(yáng)公司網(wǎng)頁(yè)網(wǎng)站建設(shè)seo工資
文章目錄
- 一、什么是定時(shí)任務(wù)
- 二、代碼示例
- 1、 @Scheduled 定時(shí)任務(wù)
- 2、多線程定時(shí)任務(wù)
- 3、基于接口(SchedulingConfigurer)實(shí)現(xiàn)動(dòng)態(tài)更改定時(shí)任務(wù)
- 3.1 數(shù)據(jù)庫(kù)中存儲(chǔ)cron信息
- 3.2 pom.xml文件中增加mysql依賴
- 3.3 application.yaml文件中增加mysql數(shù)據(jù)庫(kù)配置:
- 3.4 創(chuàng)建定時(shí)器
- 3.5 啟動(dòng)測(cè)試
一、什么是定時(shí)任務(wù)
在項(xiàng)目開發(fā)過(guò)程中,經(jīng)常會(huì)使用到定時(shí)任務(wù)。顧名思義,定時(shí)任務(wù)一般指定時(shí)執(zhí)行的方法。例如,每天凌晨0點(diǎn)同步 A 系統(tǒng)的數(shù)據(jù)到 B 系統(tǒng);每2小時(shí)統(tǒng)計(jì)用戶的積分情況;每周一給支付寶用戶推送上周收入支出數(shù)據(jù)報(bào)表等等。
一般情況下,很多業(yè)務(wù)會(huì)定時(shí)在凌晨進(jìn)行處理。因?yàn)檫@能避開用戶使用高峰期,空閑時(shí)服務(wù)器資源充足,而且對(duì)用戶影響小。
通過(guò) Spring Boot 框架,我們可以使用3種方式來(lái)實(shí)現(xiàn)定時(shí)任務(wù)。
- 第1種是基于注解的方式,比較常用,但是這種在程序運(yùn)行過(guò)程種不能動(dòng)態(tài)更改定時(shí)任務(wù)的時(shí)間。
- 第2種是可以動(dòng)態(tài)更改定時(shí)任務(wù)的時(shí)間。
- 第3種是可以動(dòng)態(tài)更改定時(shí)任務(wù)的時(shí)間,還可以動(dòng)態(tài)啟動(dòng),停止定時(shí)任務(wù)。
二、代碼示例
1、 @Scheduled 定時(shí)任務(wù)
使用 Spring Boot 內(nèi)置的注解方式,即在需要定時(shí)執(zhí)行的方法上添加@Scheduled注解即可。定時(shí)執(zhí)行的方法不能有參數(shù),并且一般沒有返回值,即使有返回值也沒什么用。注意定時(shí)任務(wù)所在的類要作為 Spring Bean,在類上添加@Component注解即可。
package com.chenpi.springschedule.task;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;/*** @author * @version 1.0* @description 定時(shí)任務(wù)類* @date 2024-11-05*/
@Component
public class ScheduledTask {private static final Logger LOGGER = LoggerFactory.getLogger(ScheduledTask.class);// 每5秒執(zhí)行一次@Scheduled(cron = "0/5 * * * * ? ")public void test() {LOGGER.info(">>>>> ScheduledTask doing ...");}
}
然后在啟動(dòng)類上添加@EnableScheduling注解開啟定時(shí)任務(wù)。默認(rèn)情況下,系統(tǒng)會(huì)自動(dòng)啟動(dòng)一個(gè)線程,調(diào)度執(zhí)行項(xiàng)目中定義的所有定時(shí)任務(wù)。
package com.chenpi.springschedule;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;@SpringBootApplication
@EnableScheduling
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}}
啟動(dòng)項(xiàng)目,即可在控制臺(tái)中每5秒看到定時(shí)任務(wù)被執(zhí)行
2024-11-05 20:46:55.011 INFO 11800 --- [ scheduling-1] c.c.springschedule.task.ScheduledTask : >>>>> ScheduledTask doing ...
2024-11-05 20:47:00.014 INFO 11800 --- [ scheduling-1] c.c.springschedule.task.ScheduledTask : >>>>> ScheduledTask doing ...
2024-11-05