springboot中設(shè)置定時任務(wù)的三種方法小結(jié)
前言
springboot中設(shè)置定時任務(wù)有三種常見的方式,分別為:
- 基于
@Scheduled
注解。 - 基于Quartz框架。
- 基于xxl-job框架。
下面將分別闡述下這三種方式的實現(xiàn)方式和優(yōu)缺點。
1. @Scheduled
介紹
@Scheduled
注解是Spring Framework提供的一個非常簡單的創(chuàng)建定時任務(wù)的方法,將注解添加在方法。Spring Boot會自動配置一個任務(wù)調(diào)度器來執(zhí)行這些方法。
但需要在Spring Boot應(yīng)用的主類或配置類上添加@EnableScheduling
注解來啟用定時任務(wù)的自動配置。然后,你可以在任何Spring管理的bean上使用@Scheduled
注解來聲明定時任務(wù)。
代碼實現(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)點
- 簡單易用: 只需在方法上添加
@Scheduled
注解即可,無需復(fù)雜配置。 - 無需額外依賴: Spring框架內(nèi)置支持,不需要添加額外的庫。
- 集成度高: 與Spring生態(tài)系統(tǒng)無縫集成,易于與其他Spring組件協(xié)作。
缺點
- 功能有限:不支持持久化存儲任務(wù)狀態(tài),不適合復(fù)雜的調(diào)度需求。
- 不支持分布式: 無法在多個服務(wù)實例之間同步任務(wù)狀態(tài),不適合分布式系統(tǒng)。
- 缺乏動態(tài)控制: 任務(wù)調(diào)度一旦設(shè)定,無法在運行時動態(tài)修改(除非重新部署應(yīng)用)。
2. 基于Quartz框架
介紹
Quartz是一個開源的作業(yè)調(diào)度庫,可以集成到幾乎任何Java應(yīng)用程序中。它提供了豐富的調(diào)度選項,包括一次性執(zhí)行、按照固定間隔重復(fù)執(zhí)行以及基于日歷的作業(yè)調(diào)度。
代碼實現(xiàn)
導(dǎo)入依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> <version>${spring.version}</version> </dependency>
寫任務(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ù)邏輯 } }
配置定時器
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)點
- 功能強大: 支持復(fù)雜的調(diào)度需求,如任務(wù)持久化、事務(wù)管理、錯過任務(wù)的處理等。
- 支持分布式: 可以在多個節(jié)點上同步任務(wù)狀態(tài),適合分布式部署。
- 靈活性: 支持動態(tài)添加、修改和刪除任務(wù),以及更復(fù)雜的cron表達(dá)式。
缺點
- 配置復(fù)雜: 相較于
@Scheduled
注解,Quartz需要更多的配置工作。 - 資源消耗: 因為功能強大,Quartz可能會消耗更多的系統(tǒng)資源。
- 學(xué)習(xí)曲線: 對于新手來說,Quartz的API和配置可能需要一定的學(xué)習(xí)時間。
3. 基于xxl-job框架
介紹
xxl-job是一個分布式任務(wù)調(diào)度平臺,其核心設(shè)計目標(biāo)是開發(fā)簡單、易擴展、分布式的任務(wù)調(diào)度解決方案。xxl-job在企業(yè)級別的分布式任務(wù)調(diào)度場景中非常受歡迎。
代碼實現(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í)行器心跳注冊分組依據(jù);為空則關(guān)閉自動注冊 appname: xxl-job-executor-sample # 執(zhí)行器端口號 [選填]:小于等于0則自動獲??;默認(rèn)端口為9999,單機部署多個執(zhí)行器時,注意要配置不同執(zhí)行器端口; port: 9998
配置類
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運行,當(dāng)前時間:{}", LocalDateTime.now()); }
優(yōu)點
- 分布式支持: 設(shè)計之初就考慮了分布式場景,適合大規(guī)模分布式任務(wù)調(diào)度。
- 任務(wù)管理: 提供了管理界面,可以方便地對任務(wù)進(jìn)行管理和監(jiān)控。
- 高可用性: 支持故障轉(zhuǎn)移和集群部署,提高了任務(wù)調(diào)度的可靠性。
- 擴展性: 支持自定義任務(wù)類型,可以根據(jù)需要擴展任務(wù)執(zhí)行邏輯。
缺點
- 依賴外部服務(wù): 需要部署xxl-job-admin服務(wù)來管理任務(wù),增加了系統(tǒng)復(fù)雜性。
- 額外學(xué)習(xí): 需要學(xué)習(xí)xxl-job的使用和配置,與Spring Boot的集成程度不如
@Scheduled
注解。 - 資源消耗: 由于提供了豐富的功能和管理界面,可能會消耗更多的資源。
總結(jié)
在選擇定時任務(wù)框架時,你應(yīng)該根據(jù)你的應(yīng)用場景和需求來決定。如果你的應(yīng)用簡單,不需要分布式調(diào)度和任務(wù)持久化,那么@Scheduled
注解可能是最簡單的選擇。如果你需要更復(fù)雜的調(diào)度功能,或者你的應(yīng)用是分布式的,那么Quartz或xxl-job可能更適合。xxl-job特別適合于需要集中管理和監(jiān)控任務(wù)的大型分布式系統(tǒng)。
到此這篇關(guān)于springboot中設(shè)置定時任務(wù)的三種方法小結(jié)的文章就介紹到這了,更多相關(guān)springboot 定時任務(wù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot定時任務(wù)的實現(xiàn)詳解
- 利用SpringBoot解決多個定時任務(wù)阻塞的問題
- spring配置定時任務(wù)的幾種方式總結(jié)
- Spring定時任務(wù)@scheduled多線程使用@Async注解示例
- Spring定時任務(wù)@Scheduled注解(cron表達(dá)式fixedRate?fixedDelay)
- SpringBoot中實現(xiàn)定時任務(wù)的4種方式詳解
- Spring中的Schedule動態(tài)添加修改定時任務(wù)詳解
- SpringBoot中的定時任務(wù)和異步調(diào)用詳解
- SpringBoot實現(xiàn)設(shè)置動態(tài)定時任務(wù)的方法詳解
- Spring定時任務(wù)注解@Scheduled詳解
- spring動態(tài)控制定時任務(wù)的實現(xiàn)
相關(guān)文章
SpringBoot測試配置屬性與web啟動環(huán)境超詳細(xì)圖解
Web開發(fā)的核心內(nèi)容主要包括內(nèi)嵌的Servlet容器和SpringMVCSpringBoot使用起來非常簡潔,大部分配置都有SpringBoot自動裝配,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2022-10-10詳解Java中字符串緩沖區(qū)StringBuffer類的使用
StringBuffer與String類似,只不過StringBuffer在進(jìn)行字符串處理時不生成新的對象,下面我們就來詳解Java中字符串緩沖區(qū)StringBuffer類的使用:2016-06-06如何用Java結(jié)合經(jīng)緯度位置計算目標(biāo)點的日出日落時間詳解
這篇文章主詳細(xì)講解了如何基于目標(biāo)點的經(jīng)緯度計算日出日落時間,提供了在線API和Java庫兩種計算方法,并通過實際案例展示了其應(yīng)用,需要的朋友可以參考下2025-01-01SpringBoot 創(chuàng)建容器的實現(xiàn)
這篇文章主要介紹了SpringBoot 創(chuàng)建容器的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10Java 最重要布局管理器GridBagLayout的使用方法
GridBagLayout是java里面最重要的布局管理器之一,可以做出很復(fù)雜的布局,可以說GridBagLayout是必須要學(xué)好的的,需要的朋友可以了解下2012-12-12MybatisPlus使用Wrapper實現(xiàn)條件查詢功能
這篇文章主要介紹了MybatisPlus使用Wrapper實現(xiàn)查詢功能,使用它可以實現(xiàn)很多復(fù)雜的查詢,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-06-06