一、業務場景
先說業務場景,根據用戶輸入的cron表達式進行定時調度,舉個例子:如圖
根據用戶輸入的參數,生成表達式,然后定時去執行相應的業務邏輯。
二、Controller層(不是重點)
domain類
@TableName("sys_schedule")
@Data
public class Schedule {
private static final long serialVersionUID = 1L;
/**
* 主鍵ID
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 類型: 時間, 周, 日
*/
@TableField("type")
private Integer type;
/**
* time 時間
*/
@TableField("day_time")
private String dayTime;
/**
* time 周
*/
@TableField("weekday")
private String weekday;
/**
* time 日
*/
@TableField("monthday")
private String monthday;
/**
* 選中狀態
*/
@TableField("status")
private Integer status;
@TableField("cron")
private String cron;
@Override
public String toString() {
return "Schedule{" +
"id=" + id +
", type=" + type +
", dayTime='" + dayTime + '\\'' +
", weekday='" + weekday + '\\'' +
", monthday='" + monthday + '\\'' +
", status=" + status +
", cron='" + cron + '\\'' +
'}';
}
}
controller方法
@Autowired
private ScheduleService scheduleService;
@PutMapping("/editItem")
@ResponseBody
public ResponseData editItem(Schedule schedule) {
//ResponseData自己封裝的響應結果
//param是你前端傳的,包含你的數據,如cron表達式
this.scheduleService.update(schedule);
return ResponseData.success();
}
三、Service層
接口層
public interface ScheduleService {
/**
* 更新
* @Date 2020-12-25
*/
void update(Schedule param);
/**
* 業務處理
* @Date 2020-12-25
*/
void work();
}
實現層
@Service
public class ScheduleServiceImpl implements ScheduleService {
@Override
public void update(Schedule param) {
//這里簡化了我自己的業務邏輯代碼,根據公司自己需要來寫即可
//業務邏輯代碼
//思路就是:更新數據庫的cron,類型等值,然后交給下面的定時工具類走定時方法
this.scheduleMapper.updateById(param);
String cron = param.getCron();
//this就是你的業務執行service, 這里就是scheduleService
ScheduleUtil.reset(new ScheduleTask(param.getId().toString(), this, null), cron);
}
@Override
public void work() {
//抓取數據的代碼
System.out.println("業務代碼執行。。。");
}
}
四、定時工具類
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.support.CronTrigger;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ScheduledFuture;
public class ScheduleUtil {
private static ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
private static Map<String, ScheduledFuture?> scheduledFutureMap = new HashMap<>();
static {
threadPoolTaskScheduler.initialize();
System.out.println("定時任務線程池啟動");
}
/**
* 啟動
*
* @param scheduleTask 定時任務
* @param corn 執行時間表達式
*/
public static boolean start(ScheduleTask scheduleTask, String corn) {
System.out.println("啟動定時任務線程 taskId " + scheduleTask.getId());
ScheduledFuture? scheduledFuture = threadPoolTaskScheduler
.schedule(scheduleTask, new CronTrigger(corn));
scheduledFutureMap.put(scheduleTask.getId(), scheduledFuture);
return true;
}
/**
* 取消
*
* @param scheduleTask 定時任務
*/
public static boolean cancel(ScheduleTask scheduleTask) {
System.out.println("關閉定時任務線程 taskId " + scheduleTask.getId());
ScheduledFuture? scheduledFuture = scheduledFutureMap.get(scheduleTask.getId());
if (scheduledFuture != null && !scheduledFuture.isCancelled()) {
scheduledFuture.cancel(false);
}
scheduledFutureMap.remove(scheduleTask.getId());
return true;
}
/**
* 修改
*
* @param scheduleTask 定時任務
* @param corn 執行時間表達式
*/
public static boolean reset(ScheduleTask scheduleTask, String corn) {
//先取消定時任務
cancel(scheduleTask);
//然后啟動新的定時任務
start(scheduleTask, corn);
return true;
}
}
五、工作線程
public class ScheduleTask implements Runnable {
private static final int TIMEOUT = 30000;
private String id;
private ScheduleService service;
public String getId() {
return id;
}
/**
* @param id 任務ID
* @param service 業務類
* @param keyword 關鍵字參數
*/
public ScheduleTask(String id, ScheduleService service) {
this.id = id;
this.service = service;
}
@Override
public void run() {
//你自己的業務邏輯
service.work();
}
}
到這里結束了,這里主要是根據前臺傳的時間,進行生成cron,入庫,執行定時任務。但是有一個問題,就是如果項目重啟了的話,那么定時類那是無法加載到cron表達式的。那么接下來,加一個項目啟動時,把數據庫里的cron表達式重新灌入到定時類就可以。代碼如下:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
/**
* 項目啟動時,加載
* @Date: 2020/12/25:16:00
**/
@Component
@Order(1)
public class initLineRunner implements CommandLineRunner {
@Autowired
private ScheduleService scheduleService;
@Override
public void run(String... args) throws Exception {
System.out.println("init ........... ");
//這里就是獲取你數據庫里的那個cron表達式
Schedule param = scheduleService.get();
String cron = param.getCron();
ScheduleUtil.reset(new ScheduleTask(param.getId().toString(), scheduleService, null), cron);
}
}
版權聲明:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
本文鏈接:
https://blog.csdn.net/bbscz007/article/details/111695289
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
代碼
+關注
關注
30文章
4780瀏覽量
68530 -
spring
+關注
關注
0文章
340瀏覽量
14340 -
SpringBoot
+關注
關注
0文章
173瀏覽量
177
發布評論請先 登錄
相關推薦
Linux系統定時任務Crond
會定期(默認每分鐘檢查一次)檢查系統中是否有要執行的任務工作,如果有,便會根據其預先設定的定時任務規則自動執行該定時任務工作,這個crond定時任務服務就相當于我們平時早起使用的鬧鐘一
發表于 07-05 06:22
OPC 實時任務系統動態調度算法的研究與設計The Stud
本文基于已有的OPC Server 實時任務模型,設計了處理混合任務集的動態調度算法(基于截止期優先)和實現方式。該算法實現了對混合任集可調度
發表于 05-31 15:36
?13次下載
SpringBoot如何實現動態增刪啟停定時任務
這兩種方式不能動態添加、刪除、啟動、停止任務。 要實現動態增刪啟停定時任務功能,比較廣泛的做法是集成Quartz框架。但是本人的開發原則是:在滿足項目需求的情況下,盡量少的依賴其它框架
Python定時任務的實現方式
調度模塊schedule實現定時任務 利用任務框架APScheduler實現定時任務 Job 作業 Trigger 觸發器 Executor 執行器 Jobstore 作業存儲 Eve
如何在SpringBoot項目中實現動態定時任務
之前寫過文章記錄怎么在SpringBoot項目中簡單使用定時任務,不過由于要借助cron表達式且都提前定義好放在配置文件里,不能在項目運行中動態修改任務執行時間,實在不太靈活。
解析Golang定時任務庫gron設計和原理
正巧,最近看到了 gron 這個開源項目,它是用 Golang 實現一個并發安全的定時任務庫。實現非常簡單精巧,代碼量也不多。今天我們就來一起結合源碼看一下,怎樣基于 Golang 的能力做出來一個【定時任務庫】。
xxl-job任務調度中間件解決定時任務的調度問題
xxl-job是一款非常優秀的任務調度中間件,輕量級、使用簡單、支持分布式等優點,讓它廣泛應用在我們的項目中,解決了不少定時任務的調度問題。
求一種SpringBoot定時任務動態管理通用解決方案
SpringBoot的定時任務的加強工具,實現對SpringBoot原生的定時任務進行動態管理,完全兼容原生@Scheduled注解,無需對
SpringBoot如何實現定時任務(下)
SpringBoot創建定時任務的方式很簡單,主要有兩種方式:一、基于注解的方式(@Scheduled)二、數據庫動態配置。實際開發中,第一種需要在代碼中寫死表達式,如果修改起來,又得重啟會顯得很麻煩;所以我們往往會采取第二種方
SpringBoot如何實現定時任務(上)
SpringBoot創建定時任務的方式很簡單,主要有兩種方式:一、基于注解的方式(@Scheduled)二、數據庫動態配置。實際開發中,第一種需要在代碼中寫死表達式,如果修改起來,又得重啟會顯得很麻煩;所以我們往往會采取第二種方
如何動態添加修改刪除定時任務?
如何動態添加修改刪除定時任務?那么我們一起看看具體怎么實現,先看下本節大綱:
(1)思路說明;
(2)代碼解析;
(3)修改定時任務執行周期特別說明;
Linux如何使用cron進行定時任務的操作
按計劃執行命令對于計算機來說非常重要,因為假如我親自去執行一些任務的話,可能會因為多方面因素不能按時執行,所以定時任務就顯得非常重要了!
cron就是一個能夠執行定時任務的命令,其實該命令本身不難,下面小編帶您詳細了解!
評論