SpringBoot實(shí)現(xiàn)設(shè)置動態(tài)定時任務(wù)的方法詳解
一、第一種
1. 引入依賴
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
<optional>true</optional>
</dependency>
<!-- spring boot 2.3版本后,如果需要使用校驗(yàn),需手動導(dǎo)入validation包-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
2. 添加注解
@EnableScheduling
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
System.out.println("(*^▽^*)啟動成功!!!(〃'▽'〃)");
}
}
3. application.yml
只定義了服務(wù)端口:
server: port: 8089
4. task-config.ini
定時任務(wù)執(zhí)行時間配置文件:task-config.ini:
printTime.cron=0/10 * * * * ?
5. 定時任務(wù)執(zhí)行類
package com.gblfy.demo.task;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.scheduling.Trigger;
import org.springframework.scheduling.TriggerContext;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.util.Date;
/**
* 定時任務(wù)
* @author gblfy
*/
@Data
@Slf4j
@Component
@PropertySource("classpath:/task-config.ini")
public class ScheduleTask implements SchedulingConfigurer {
@Value("${printTime.cron}")
private String cron;
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
// 動態(tài)使用cron表達(dá)式設(shè)置循環(huán)間隔
taskRegistrar.addTriggerTask(new Runnable() {
@Override
public void run() {
log.info("Current time: {}", LocalDateTime.now());
}
}, new Trigger() {
@Override
public Date nextExecutionTime(TriggerContext triggerContext) {
// 使用CronTrigger觸發(fā)器,可動態(tài)修改cron表達(dá)式來操作循環(huán)規(guī)則
CronTrigger cronTrigger = new CronTrigger(cron);
Date nextExecutionTime = cronTrigger.nextExecutionTime(triggerContext);
return nextExecutionTime;
}
});
}
}
6. 編寫一個接口
使得可以通過調(diào)用接口動態(tài)修改該定時任務(wù)的執(zhí)行時間:
package com.face.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author gblfy
*/
@Slf4j
@RestController
@RequestMapping("/test")
public class TestController {
private final ScheduleTask scheduleTask;
@Autowired
public TestController(ScheduleTask scheduleTask) {
this.scheduleTask = scheduleTask;
}
//http://localhost:8089/test/updateCron?cron=0/5%20*%20*%20*%20*%20?
@GetMapping("/updateCron")
public String updateCron(String cron) {
log.info("new cron :{}", cron);
scheduleTask.setCron(cron);
return "ok";
}
//http://localhost:8089/test/updateTimer?timer=5000
@GetMapping("/updateTimer")
public String updateTimer(Long timer) {
log.info("new timer :{}", timer);
scheduleTask.setTimer(timer);
return "ok";
}
}
啟動項(xiàng)目,可以看到任務(wù)每10秒執(zhí)行一次: 訪問接口,傳入請求參數(shù)cron表達(dá)式,將定時任務(wù)修改為15秒執(zhí)行一次: 可以看到任務(wù)變成了15秒執(zhí)行一次
http://localhost:8089/test/updateCron?cron=0/5 * * * * ?
二、第二種
除了上面的借助cron表達(dá)式的方法,還有另一種觸發(fā)器,區(qū)別于CronTrigger觸發(fā)器,該觸發(fā)器可隨意設(shè)置循環(huán)間隔時間,不像cron表達(dá)式只能定義小于等于間隔59秒。
2.1. 調(diào)整定時任務(wù)類
package com.face.controller;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.scheduling.Trigger;
import org.springframework.scheduling.TriggerContext;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.scheduling.support.PeriodicTrigger;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.util.Date;
/**
* 定時任務(wù)
* @author wl
*/
@Data
@Slf4j
@Component
@PropertySource("classpath:/task-config.ini")
public class ScheduleTask implements SchedulingConfigurer {
@Value("${printTime.cron}")
private String cron;
private Long timer = 10000L;
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
// 動態(tài)使用cron表達(dá)式設(shè)置循環(huán)間隔
taskRegistrar.addTriggerTask(new Runnable() {
@Override
public void run() {
log.info("Current time: {}", LocalDateTime.now());
}
}, new Trigger() {
@Override
public Date nextExecutionTime(TriggerContext triggerContext) {
// 使用CronTrigger觸發(fā)器,可動態(tài)修改cron表達(dá)式來操作循環(huán)規(guī)則
// CronTrigger cronTrigger = new CronTrigger(cron);
// Date nextExecutionTime = cronTrigger.nextExecutionTime(triggerContext);
// 使用不同的觸發(fā)器,為設(shè)置循環(huán)時間的關(guān)鍵,區(qū)別于CronTrigger觸發(fā)器,該觸發(fā)器可隨意設(shè)置循環(huán)間隔時間,單位為毫秒
PeriodicTrigger periodicTrigger = new PeriodicTrigger(timer);
Date nextExecutionTime = periodicTrigger.nextExecutionTime(triggerContext);
return nextExecutionTime;`在這里插入代碼片`
}
});
}
}
2.2. 添加更新方法
@GetMapping("/updateTimer")
public String updateTimer(Long timer) {
log.info("new timer :{}", timer);
scheduleTask.setTimer(timer);
return "ok";
}
2.3. 測試
//localhost:8089/test/updateTimer?timer=5000
三、推薦方案
上面有很多弊端,弊端定時任務(wù)監(jiān)控,單機(jī)故障等等,建議采用分布式任務(wù)調(diào)度框架xxl-job
到此這篇關(guān)于SpringBoot實(shí)現(xiàn)設(shè)置動態(tài)定時任務(wù)的方法詳解的文章就介紹到這了,更多相關(guān)SpringBoot設(shè)置動態(tài)定時任務(wù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot實(shí)現(xiàn)動態(tài)定時任務(wù)
- SpringBoot 動態(tài)定時器的使用方法
- 淺談SpringBoot集成Quartz動態(tài)定時任務(wù)
- SpringBoot設(shè)置動態(tài)定時任務(wù)的方法詳解
- SpringBoot實(shí)現(xiàn)固定和動態(tài)定時任務(wù)的三種方法
- SpringBoot創(chuàng)建動態(tài)定時任務(wù)的幾種方式小結(jié)
- SpringBoot+Quartz實(shí)現(xiàn)動態(tài)定時任務(wù)
- Springboot實(shí)現(xiàn)動態(tài)定時任務(wù)流程詳解
- SpringBoot動態(tài)定時任務(wù)實(shí)現(xiàn)完整版
- Springboot實(shí)現(xiàn)動態(tài)定時任務(wù)管理的示例代碼
- 基于Nacos實(shí)現(xiàn)SpringBoot動態(tài)定時任務(wù)調(diào)度
相關(guān)文章
MyBatis使用級聯(lián)操作解決lombok構(gòu)造方法識別失敗問題
這篇文章主要介紹了MyBatis使用級聯(lián)操作解決lombok構(gòu)造方法識別失敗問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-07-07
java中l(wèi)ist和數(shù)組互相轉(zhuǎn)換的一些方法總結(jié)
在日常的Java開發(fā)中經(jīng)常會遇到需要在數(shù)組和List之間進(jìn)行轉(zhuǎn)換的情況,這篇文章主要給大家介紹了關(guān)于java中l(wèi)ist和數(shù)組互相轉(zhuǎn)換的一些方法,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-12-12
java 實(shí)現(xiàn)當(dāng)前時間加減30分鐘的時間代碼
這篇文章主要介紹了java 實(shí)現(xiàn)當(dāng)前時間加減30分鐘的時間代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08
Spring Boot集成Apache Kafka的實(shí)戰(zhàn)指南
Apache Kafka 是一個分布式流處理平臺,廣泛用于構(gòu)建實(shí)時數(shù)據(jù)管道、日志聚合系統(tǒng)和事件溯源架構(gòu),下面我們來看看如何在 Spring Boot 項(xiàng)目中集成 Kafka吧2025-06-06
Invalid bound statement(not found):錯誤的解決方案
本文介紹了在開發(fā)Java SpringBoot應(yīng)用程序時出現(xiàn)的"Invalidboundstatement(notfound)"錯誤的原因及解決方法,該錯誤通常與MyBatis或其他持久化框架相關(guān),可能是由于配置錯誤、拼寫錯誤或其他問題引起的,解決方法包括檢查SQL映射文件2025-01-01
深入淺出SpringBoot WebSocket構(gòu)建實(shí)時應(yīng)用全面指南
WebSocket 是一種在單個 TCP 連接上進(jìn)行全雙工通信的協(xié)議,這篇文章主要為大家詳細(xì)介紹了SpringBoot如何集成WebSocket構(gòu)建實(shí)時應(yīng)用,感興趣的小伙伴可以了解下2025-07-07
實(shí)例講解Java的Spring框架中的控制反轉(zhuǎn)和依賴注入
這篇文章主要介紹了Java的Spring框架中的控制反轉(zhuǎn)和依賴注入,Spring是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下2016-02-02
Springboot+echarts實(shí)現(xiàn)可視化
這篇文章主要為大家詳細(xì)介紹了Springboot+echarts實(shí)現(xiàn)可視化,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-12-12

