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

