springboot中設(shè)置定時(shí)任務(wù)的三種方法小結(jié)
前言
springboot中設(shè)置定時(shí)任務(wù)有三種常見(jiàn)的方式,分別為:
- 基于
@Scheduled
注解。 - 基于Quartz框架。
- 基于xxl-job框架。
下面將分別闡述下這三種方式的實(shí)現(xiàn)方式和優(yōu)缺點(diǎn)。
1. @Scheduled
介紹
@Scheduled
注解是Spring Framework提供的一個(gè)非常簡(jiǎn)單的創(chuàng)建定時(shí)任務(wù)的方法,將注解添加在方法。Spring Boot會(huì)自動(dòng)配置一個(gè)任務(wù)調(diào)度器來(lái)執(zhí)行這些方法。
但需要在Spring Boot應(yīng)用的主類(lèi)或配置類(lèi)上添加@EnableScheduling
注解來(lái)啟用定時(shí)任務(wù)的自動(dòng)配置。然后,你可以在任何Spring管理的bean上使用@Scheduled
注解來(lái)聲明定時(shí)任務(wù)。
代碼實(shí)現(xiàn)
import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @Component public class ScheduledTasks { @Scheduled(fixedRate = 5000) public void taskWithFixedRate() { // 任務(wù)邏輯 } @Scheduled(cron = "0 * * * * ?") public void taskWithCronExpression() { // 任務(wù)邏輯 } }
@Scheduled(fixedRate = 5000)
是taskWithFixedRate()方法每5秒執(zhí)行一次。
@Scheduled(cron = "0 * * * * ?")
是taskWithCronExpression()方法根據(jù)cron表達(dá)式執(zhí)行。
優(yōu)點(diǎn)
- 簡(jiǎn)單易用: 只需在方法上添加
@Scheduled
注解即可,無(wú)需復(fù)雜配置。 - 無(wú)需額外依賴: Spring框架內(nèi)置支持,不需要添加額外的庫(kù)。
- 集成度高: 與Spring生態(tài)系統(tǒng)無(wú)縫集成,易于與其他Spring組件協(xié)作。
缺點(diǎn)
- 功能有限:不支持持久化存儲(chǔ)任務(wù)狀態(tài),不適合復(fù)雜的調(diào)度需求。
- 不支持分布式: 無(wú)法在多個(gè)服務(wù)實(shí)例之間同步任務(wù)狀態(tài),不適合分布式系統(tǒng)。
- 缺乏動(dòng)態(tài)控制: 任務(wù)調(diào)度一旦設(shè)定,無(wú)法在運(yùn)行時(shí)動(dòng)態(tài)修改(除非重新部署應(yīng)用)。
2. 基于Quartz框架
介紹
Quartz是一個(gè)開(kāi)源的作業(yè)調(diào)度庫(kù),可以集成到幾乎任何Java應(yīng)用程序中。它提供了豐富的調(diào)度選項(xiàng),包括一次性執(zhí)行、按照固定間隔重復(fù)執(zhí)行以及基于日歷的作業(yè)調(diào)度。
代碼實(shí)現(xiàn)
導(dǎo)入依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> <version>${spring.version}</version> </dependency>
寫(xiě)任務(wù)邏輯
package com.account.job; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.springframework.stereotype.Component; /** * @author Hao * @date 2023-11-06 17:00 */ @Component public class UsernameJob implements Job { @Override public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { // 任務(wù)邏輯 } }
配置定時(shí)器
package com.account.config; import com.account.job.UsernameJob; import org.quartz.*; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * @author Hao * @date 2023-11-06 14:58 */ @Configuration public class UsernameQuartzConfig { @Bean public JobDetail userLogJob() { return JobBuilder.newJob(UsernameJob.class) .storeDurably(true) .build(); } @Bean public Trigger usernameJobTrigger() { return TriggerBuilder.newTrigger() .forJob(userLogJob()) .withSchedule(CronScheduleBuilder.cronSchedule("0 30 * * * ?")) //每30分鐘執(zhí)行一次 .build(); } }
優(yōu)點(diǎn)
- 功能強(qiáng)大: 支持復(fù)雜的調(diào)度需求,如任務(wù)持久化、事務(wù)管理、錯(cuò)過(guò)任務(wù)的處理等。
- 支持分布式: 可以在多個(gè)節(jié)點(diǎn)上同步任務(wù)狀態(tài),適合分布式部署。
- 靈活性: 支持動(dòng)態(tài)添加、修改和刪除任務(wù),以及更復(fù)雜的cron表達(dá)式。
缺點(diǎn)
- 配置復(fù)雜: 相較于
@Scheduled
注解,Quartz需要更多的配置工作。 - 資源消耗: 因?yàn)楣δ軓?qiáng)大,Quartz可能會(huì)消耗更多的系統(tǒng)資源。
- 學(xué)習(xí)曲線: 對(duì)于新手來(lái)說(shuō),Quartz的API和配置可能需要一定的學(xué)習(xí)時(shí)間。
3. 基于xxl-job框架
介紹
xxl-job是一個(gè)分布式任務(wù)調(diào)度平臺(tái),其核心設(shè)計(jì)目標(biāo)是開(kāi)發(fā)簡(jiǎn)單、易擴(kuò)展、分布式的任務(wù)調(diào)度解決方案。xxl-job在企業(yè)級(jí)別的分布式任務(wù)調(diào)度場(chǎng)景中非常受歡迎。
代碼實(shí)現(xiàn)
搭建linux服務(wù):搭建教程
導(dǎo)入依賴
<xxl-job.version>2.3.1</xxl-job.version> <dependency> <groupId>com.xuxueli</groupId> <artifactId>xxl-job-core</artifactId> <version>${xxl-job.version}</version> </dependency>
yml配置文件
#XXL-job配置 xxl: job: admin: addresses: http://192.168.133.100:9898/xxl-job-admin accessToken: default_token executor: # 執(zhí)行器AppName [選填]:執(zhí)行器心跳注冊(cè)分組依據(jù);為空則關(guān)閉自動(dòng)注冊(cè) appname: xxl-job-executor-sample # 執(zhí)行器端口號(hào) [選填]:小于等于0則自動(dòng)獲取;默認(rèn)端口為9999,單機(jī)部署多個(gè)執(zhí)行器時(shí),注意要配置不同執(zhí)行器端口; port: 9998
配置類(lèi)
package com.replication.config; import com.xxl.job.core.executor.impl.XxlJobSpringExecutor; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * @author Hao * @date 2023-12-04 11:07 */ @Configuration public class XxlJobConfig { @Value("${xxl.job.admin.addresses}") private String adminAddresses; @Value("${xxl.job.accessToken}") private String accessToken; @Value("${xxl.job.executor.appname}") private String appName; @Value("${xxl.job.executor.port}") private int port; @Bean public XxlJobSpringExecutor xxlJobSpringExecutor() { XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor(); xxlJobSpringExecutor.setAdminAddresses(adminAddresses); xxlJobSpringExecutor.setAccessToken(accessToken); xxlJobSpringExecutor.setAppname(appName); xxlJobSpringExecutor.setPort(port); return xxlJobSpringExecutor; } }
注解使用
@XxlJob("helloXxl") public void xxlJob() { log.debug("xxlJob運(yùn)行,當(dāng)前時(shí)間:{}", LocalDateTime.now()); }
優(yōu)點(diǎn)
- 分布式支持: 設(shè)計(jì)之初就考慮了分布式場(chǎng)景,適合大規(guī)模分布式任務(wù)調(diào)度。
- 任務(wù)管理: 提供了管理界面,可以方便地對(duì)任務(wù)進(jìn)行管理和監(jiān)控。
- 高可用性: 支持故障轉(zhuǎn)移和集群部署,提高了任務(wù)調(diào)度的可靠性。
- 擴(kuò)展性: 支持自定義任務(wù)類(lèi)型,可以根據(jù)需要擴(kuò)展任務(wù)執(zhí)行邏輯。
缺點(diǎn)
- 依賴外部服務(wù): 需要部署xxl-job-admin服務(wù)來(lái)管理任務(wù),增加了系統(tǒng)復(fù)雜性。
- 額外學(xué)習(xí): 需要學(xué)習(xí)xxl-job的使用和配置,與Spring Boot的集成程度不如
@Scheduled
注解。 - 資源消耗: 由于提供了豐富的功能和管理界面,可能會(huì)消耗更多的資源。
總結(jié)
在選擇定時(shí)任務(wù)框架時(shí),你應(yīng)該根據(jù)你的應(yīng)用場(chǎng)景和需求來(lái)決定。如果你的應(yīng)用簡(jiǎn)單,不需要分布式調(diào)度和任務(wù)持久化,那么@Scheduled
注解可能是最簡(jiǎn)單的選擇。如果你需要更復(fù)雜的調(diào)度功能,或者你的應(yīng)用是分布式的,那么Quartz或xxl-job可能更適合。xxl-job特別適合于需要集中管理和監(jiān)控任務(wù)的大型分布式系統(tǒng)。
到此這篇關(guān)于springboot中設(shè)置定時(shí)任務(wù)的三種方法小結(jié)的文章就介紹到這了,更多相關(guān)springboot 定時(shí)任務(wù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot定時(shí)任務(wù)的實(shí)現(xiàn)詳解
- 利用SpringBoot解決多個(gè)定時(shí)任務(wù)阻塞的問(wèn)題
- spring配置定時(shí)任務(wù)的幾種方式總結(jié)
- Spring定時(shí)任務(wù)@scheduled多線程使用@Async注解示例
- Spring定時(shí)任務(wù)@Scheduled注解(cron表達(dá)式fixedRate?fixedDelay)
- SpringBoot中實(shí)現(xiàn)定時(shí)任務(wù)的4種方式詳解
- Spring中的Schedule動(dòng)態(tài)添加修改定時(shí)任務(wù)詳解
- SpringBoot中的定時(shí)任務(wù)和異步調(diào)用詳解
- SpringBoot實(shí)現(xiàn)設(shè)置動(dòng)態(tài)定時(shí)任務(wù)的方法詳解
- Spring定時(shí)任務(wù)注解@Scheduled詳解
- spring動(dòng)態(tài)控制定時(shí)任務(wù)的實(shí)現(xiàn)
相關(guān)文章
Springboot自定義banner及驗(yàn)證過(guò)程
這篇文章主要介紹了Springboot自定義banner及驗(yàn)證過(guò)程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04SpringBoot測(cè)試配置屬性與web啟動(dòng)環(huán)境超詳細(xì)圖解
Web開(kāi)發(fā)的核心內(nèi)容主要包括內(nèi)嵌的Servlet容器和SpringMVCSpringBoot使用起來(lái)非常簡(jiǎn)潔,大部分配置都有SpringBoot自動(dòng)裝配,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2022-10-10詳解Java中字符串緩沖區(qū)StringBuffer類(lèi)的使用
StringBuffer與String類(lèi)似,只不過(guò)StringBuffer在進(jìn)行字符串處理時(shí)不生成新的對(duì)象,下面我們就來(lái)詳解Java中字符串緩沖區(qū)StringBuffer類(lèi)的使用:2016-06-06如何用Java結(jié)合經(jīng)緯度位置計(jì)算目標(biāo)點(diǎn)的日出日落時(shí)間詳解
這篇文章主詳細(xì)講解了如何基于目標(biāo)點(diǎn)的經(jīng)緯度計(jì)算日出日落時(shí)間,提供了在線API和Java庫(kù)兩種計(jì)算方法,并通過(guò)實(shí)際案例展示了其應(yīng)用,需要的朋友可以參考下2025-01-01SpringBoot 創(chuàng)建容器的實(shí)現(xiàn)
這篇文章主要介紹了SpringBoot 創(chuàng)建容器的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10Java 最重要布局管理器GridBagLayout的使用方法
GridBagLayout是java里面最重要的布局管理器之一,可以做出很復(fù)雜的布局,可以說(shuō)GridBagLayout是必須要學(xué)好的的,需要的朋友可以了解下2012-12-12MybatisPlus使用Wrapper實(shí)現(xiàn)條件查詢功能
這篇文章主要介紹了MybatisPlus使用Wrapper實(shí)現(xiàn)查詢功能,使用它可以實(shí)現(xiàn)很多復(fù)雜的查詢,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06