SpringBoot最新定時(shí)任務(wù)的7種實(shí)現(xiàn)方案
在現(xiàn)代應(yīng)用中,定時(shí)任務(wù)是一個(gè)非常常見(jiàn)的需求,例如定時(shí)清理過(guò)期數(shù)據(jù)、定時(shí)生成報(bào)表等。本文將通過(guò) 7 種方式講解如何在 SpringBoot 中實(shí)現(xiàn)定時(shí)任務(wù),幫助開(kāi)發(fā)者根據(jù)場(chǎng)景選擇適合的解決方案。
1. 使用 @Scheduled 注解實(shí)現(xiàn)簡(jiǎn)單定時(shí)任務(wù)
Spring 提供了 @Scheduled 注解,可以快速實(shí)現(xiàn)定時(shí)任務(wù)。只需在啟動(dòng)類或配置類上加上 @EnableScheduling 注解。
示例代碼
@EnableScheduling @SpringBootApplication public class ScheduledTaskApplication { public static void main(String[] args) { SpringApplication.run(ScheduledTaskApplication.class, args); } @Component public static class SimpleTask { @Scheduled(cron = "0 0/1 * * * ?") // 每分鐘執(zhí)行一次 public void execute() { System.out.println("簡(jiǎn)單定時(shí)任務(wù)執(zhí)行:" + LocalDateTime.now()); } } }
優(yōu)勢(shì)
- 簡(jiǎn)單易用
- 無(wú)需額外依賴
局限性
- 不支持分布式任務(wù)調(diào)度
2. 使用 ScheduledExecutorService 實(shí)現(xiàn)定時(shí)任務(wù)
ScheduledExecutorService 是 Java 自帶的定時(shí)任務(wù)工具,可以實(shí)現(xiàn)簡(jiǎn)單的并發(fā)任務(wù)。
示例代碼
@Component public class ExecutorServiceTask { private final ScheduledExecutorService executorService = Executors.newScheduledThreadPool(2); @PostConstruct public void init() { executorService.scheduleAtFixedRate(() -> { System.out.println("ExecutorService 任務(wù)執(zhí)行:" + LocalDateTime.now()); }, 0, 1, TimeUnit.MINUTES); } }
優(yōu)勢(shì)
- 支持并發(fā)執(zhí)行
局限性
- 不支持動(dòng)態(tài)配置任務(wù)
3. 使用 Quartz 實(shí)現(xiàn)復(fù)雜調(diào)度任務(wù)
Quartz 是一個(gè)功能強(qiáng)大的任務(wù)調(diào)度框架,支持復(fù)雜的調(diào)度任務(wù)。
示例代碼
依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency>
配置與任務(wù)
@Configuration public class QuartzConfig { @Bean public JobDetail jobDetail() { return JobBuilder.newJob(SampleJob.class) .withIdentity("sampleJob") .storeDurably() .build(); } @Bean public Trigger trigger(JobDetail jobDetail) { return TriggerBuilder.newTrigger() .forJob(jobDetail) .withSchedule(CronScheduleBuilder.cronSchedule("0 0/1 * * * ?")) .build(); } public static class SampleJob implements Job { @Override public void execute(JobExecutionContext context) { System.out.println("Quartz 任務(wù)執(zhí)行:" + LocalDateTime.now()); } } }
優(yōu)勢(shì)
- 支持分布式任務(wù)
- 功能強(qiáng)大
局限性
- 學(xué)習(xí)曲線較陡
- 配置復(fù)雜
4. 使用 Spring TaskScheduler 實(shí)現(xiàn)定時(shí)任務(wù)
Spring 提供了 TaskScheduler 接口,支持動(dòng)態(tài)任務(wù)。
示例代碼
@Component public class TaskSchedulerTask { @Autowired private TaskScheduler taskScheduler; @PostConstruct public void init() { taskScheduler.scheduleAtFixedRate(() -> { System.out.println("TaskScheduler 任務(wù)執(zhí)行:" + LocalDateTime.now()); }, 60000); } }
優(yōu)勢(shì)
- 簡(jiǎn)單靈活
局限性
- 不支持復(fù)雜的任務(wù)調(diào)度
5. 使用 Redis 實(shí)現(xiàn)分布式定時(shí)任務(wù)
借助 Redis 的分布式特性,可以實(shí)現(xiàn)簡(jiǎn)單的分布式定時(shí)任務(wù)。
示例代碼
@Component public class RedisTask { @Autowired private StringRedisTemplate redisTemplate; @Scheduled(cron = "0 0/1 * * * ?") public void execute() { String lockKey = "redis_task_lock"; Boolean lock = redisTemplate.opsForValue().setIfAbsent(lockKey, "lock", 60, TimeUnit.SECONDS); if (Boolean.TRUE.equals(lock)) { try { System.out.println("Redis 分布式任務(wù)執(zhí)行:" + LocalDateTime.now()); } finally { redisTemplate.delete(lockKey); } } } }
優(yōu)勢(shì)
- 支持分布式環(huán)境
局限性
- 實(shí)現(xiàn)較為復(fù)雜
6. 使用 XXL-JOB 實(shí)現(xiàn)分布式任務(wù)調(diào)度
XXL-JOB 是一個(gè)輕量級(jí)分布式任務(wù)調(diào)度平臺(tái)。
示例代碼
依賴
<dependency> <groupId>com.xuxueli</groupId> <artifactId>xxl-job-core</artifactId> <version>2.3.0</version> </dependency>
配置與任務(wù)
@XxlJob("sampleJob") public void sampleJobHandler() { System.out.println("XXL-JOB 任務(wù)執(zhí)行:" + LocalDateTime.now()); }
優(yōu)勢(shì)
- 強(qiáng)大的分布式調(diào)度能力
- 提供管理界面
7. 使用開(kāi)源框架 Elastic-Job 實(shí)現(xiàn)動(dòng)態(tài)任務(wù)
Elastic-Job 是一個(gè)分布式任務(wù)調(diào)度框架,支持動(dòng)態(tài)任務(wù)管理。
示例代碼
依賴
<dependency> <groupId>org.apache.shardingsphere.elasticjob-lite</groupId> <artifactId>elasticjob-lite-spring-boot-starter</artifactId> <version>3.0.1</version> </dependency>
配置與任務(wù)
@ElasticJobConfiguration( cron = "0 0/1 * * * ?", jobName = "elasticJobSample", shardingTotalCount = 1 ) public class ElasticJobTask implements SimpleJob { @Override public void execute(ShardingContext shardingContext) { System.out.println("Elastic-Job 任務(wù)執(zhí)行:" + LocalDateTime.now()); } }
優(yōu)勢(shì)
- 支持分布式任務(wù)
- 高度靈活
總結(jié)
在 SpringBoot 中實(shí)現(xiàn)定時(shí)任務(wù)有多種方式,可以根據(jù)實(shí)際需求選擇:
- 簡(jiǎn)單任務(wù):@Scheduled 和 ScheduledExecutorService
- 分布式任務(wù):XXL-JOB 和 Elastic-Job
- 復(fù)雜任務(wù):Quartz
- 動(dòng)態(tài)任務(wù):TaskScheduler 和 Redis
通過(guò)合理選擇和組合這些工具,能夠構(gòu)建出性能優(yōu)越、功能豐富的定時(shí)任務(wù)系統(tǒng)。
到此這篇關(guān)于SpringBoot最新定時(shí)任務(wù)的7種實(shí)現(xiàn)方案的文章就介紹到這了,更多相關(guān)SpringBoot7種定時(shí)任務(wù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot項(xiàng)目使用@Scheduled注解實(shí)現(xiàn)定時(shí)任務(wù)的方法
- SpringBoot整合ShedLock解決定時(shí)任務(wù)防止重復(fù)執(zhí)行的問(wèn)題
- SpringBoot項(xiàng)目如何使用多線程執(zhí)行定時(shí)任務(wù)
- SpringBoot集成ShedLock實(shí)現(xiàn)分布式定時(shí)任務(wù)的示例代碼
- springboot定時(shí)任務(wù)不起作用問(wèn)題及解決
- 基于SpringBoot實(shí)現(xiàn)輕量級(jí)的動(dòng)態(tài)定時(shí)任務(wù)調(diào)度的方法
- SpringBoot最簡(jiǎn)單的定時(shí)任務(wù)@Scheduler的使用及解讀
相關(guān)文章
java發(fā)送javax.mail郵件實(shí)例講解
這篇文章主要為大家介紹了java發(fā)送javax.mail郵件實(shí)例講解,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-01-01Spring @RestController注解組合實(shí)現(xiàn)方法解析
這篇文章主要介紹了Spring @RestController注解組合實(shí)現(xiàn)方法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06Spring的初始化和XML解析的實(shí)現(xiàn)
這篇文章主要介紹了Spring的初始化和XML解析的實(shí)現(xiàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-03-03Spring Boot Excel文件導(dǎo)出下載實(shí)現(xiàn)代碼
這篇文章帶領(lǐng)我們直接實(shí)現(xiàn)Excel文件的直接導(dǎo)出下載,后續(xù)開(kāi)發(fā)不需要開(kāi)發(fā)很多代碼,直接繼承已經(jīng)寫好的代碼,增加一個(gè)Xml配置就可以直接導(dǎo)出。具體實(shí)現(xiàn)代碼大家跟隨小編一起通過(guò)本文學(xué)習(xí)吧2018-11-11基于Eclipce配置Spring Boot過(guò)程圖解
這篇文章主要介紹了基于Eclipce配置Spring Boot過(guò)程圖解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03java?-jar命令及SpringBoot通過(guò)java?-jav啟動(dòng)項(xiàng)目的過(guò)程
本篇文章將為大家講述關(guān)于 SpringBoot 項(xiàng)目工程完成后,是如何通過(guò) java-jar 命令來(lái)啟動(dòng)的,以及介紹 java-jar 命令的詳細(xì)內(nèi)容,對(duì)SpringBoot java?-jav啟動(dòng)過(guò)程感興趣的朋友跟隨小編一起看看吧2023-05-05詳細(xì)解讀Druid數(shù)據(jù)庫(kù)連接池的使用
這篇文章主要介紹了Druid數(shù)據(jù)庫(kù)連接池的使用,數(shù)據(jù)庫(kù)連接池負(fù)責(zé)分配、管理和釋放數(shù)據(jù)庫(kù)連接,它允許應(yīng)用程序重復(fù)使用一個(gè)現(xiàn)有的數(shù)據(jù)庫(kù)連接,而不是重新建立一個(gè),需要的朋友可以參考下2023-03-03SpringBoot整合SpringSecurityOauth2實(shí)現(xiàn)鑒權(quán)動(dòng)態(tài)權(quán)限問(wèn)題
這篇文章主要介紹了SpringBoot整合SpringSecurityOauth2實(shí)現(xiàn)鑒權(quán)-動(dòng)態(tài)權(quán)限,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06Java中的Web MVC簡(jiǎn)介_(kāi)動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
MVC模型是一種架構(gòu)型的模式,本身不引入新功能,只是幫助我們將開(kāi)發(fā)的結(jié)構(gòu)組織的更加合理,使展示與模型分離、流程控制邏輯、業(yè)務(wù)邏輯調(diào)用與展示邏輯分離2017-09-09