色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

SpringBoot-動態定時任務調度

jf_78858299 ? 來源:CSDN ? 作者:如約而至的重逢 ? 2023-04-07 14:56 ? 次閱讀

一、業務場景

先說業務場景,根據用戶輸入的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框架。但是本人的開發原則是:在滿足項目需求的情況下,盡量少的依賴其它框架
    的頭像 發表于 09-24 09:49 ?2936次閱讀
    <b class='flag-5'>SpringBoot</b>如何實現<b class='flag-5'>動態</b>增刪啟停<b class='flag-5'>定時任務</b>

    Python定時任務的實現方式

    調度模塊schedule實現定時任務 利用任務框架APScheduler實現定時任務 Job 作業 Trigger 觸發器 Executor 執行器 Jobstore 作業存儲 Eve
    的頭像 發表于 10-08 15:20 ?5725次閱讀

    如何在SpringBoot項目中實現動態定時任務

    之前寫過文章記錄怎么在SpringBoot項目中簡單使用定時任務,不過由于要借助cron表達式且都提前定義好放在配置文件里,不能在項目運行中動態修改任務執行時間,實在不太靈活。
    的頭像 發表于 09-30 11:16 ?1803次閱讀

    解析Golang定時任務庫gron設計和原理

    正巧,最近看到了 gron 這個開源項目,它是用 Golang 實現一個并發安全的定時任務庫。實現非常簡單精巧,代碼量也不多。今天我們就來一起結合源碼看一下,怎樣基于 Golang 的能力做出來一個【定時任務庫】。
    的頭像 發表于 12-15 13:57 ?1328次閱讀

    xxl-job任務調度中間件解決定時任務調度問題

    xxl-job是一款非常優秀的任務調度中間件,輕量級、使用簡單、支持分布式等優點,讓它廣泛應用在我們的項目中,解決了不少定時任務調度問題。
    的頭像 發表于 01-31 09:53 ?1925次閱讀

    求一種SpringBoot定時任務動態管理通用解決方案

    SpringBoot定時任務的加強工具,實現對SpringBoot原生的定時任務進行動態管理,完全兼容原生@Scheduled注解,無需對
    的頭像 發表于 02-03 09:49 ?774次閱讀

    SpringBoot如何實現定時任務(下)

    SpringBoot創建定時任務的方式很簡單,主要有兩種方式:一、基于注解的方式(@Scheduled)二、數據庫動態配置。實際開發中,第一種需要在代碼中寫死表達式,如果修改起來,又得重啟會顯得很麻煩;所以我們往往會采取第二種方
    的頭像 發表于 04-07 14:51 ?1231次閱讀
    <b class='flag-5'>SpringBoot</b>如何實現<b class='flag-5'>定時任務</b>(下)

    SpringBoot如何實現定時任務(上)

    SpringBoot創建定時任務的方式很簡單,主要有兩種方式:一、基于注解的方式(@Scheduled)二、數據庫動態配置。實際開發中,第一種需要在代碼中寫死表達式,如果修改起來,又得重啟會顯得很麻煩;所以我們往往會采取第二種方
    的頭像 發表于 04-07 14:51 ?1342次閱讀
    <b class='flag-5'>SpringBoot</b>如何實現<b class='flag-5'>定時任務</b>(上)

    在Spring Boot中如何使用定時任務

    本文介紹在 Spring Boot 中如何使用定時任務,使用非常簡單,就不做過多說明了。
    的頭像 發表于 04-12 10:56 ?966次閱讀

    如何動態添加修改刪除定時任務

    如何動態添加修改刪除定時任務?那么我們一起看看具體怎么實現,先看下本節大綱: (1)思路說明; (2)代碼解析; (3)修改定時任務執行周期特別說明;
    的頭像 發表于 04-12 11:06 ?1071次閱讀

    Linux如何使用cron進行定時任務的操作

    按計劃執行命令對于計算機來說非常重要,因為假如我親自去執行一些任務的話,可能會因為多方面因素不能按時執行,所以定時任務就顯得非常重要了! cron就是一個能夠執行定時任務的命令,其實該命令本身不難,下面小編帶您詳細了解!
    的頭像 發表于 05-12 16:27 ?2052次閱讀

    python定時任務實踐

    由于程序需求,監測配置變化需要設置定時任務,每分鐘執行一次,對任務持久化要求不高,不需要時可以關閉定時任務
    的頭像 發表于 05-20 17:53 ?973次閱讀
    python<b class='flag-5'>定時任務</b>實踐

    linux定時任務的用法總結

    習慣了使用 windows 的計劃任務,使用 linux 中的 crontab 管理定時任務時很不適應。
    的頭像 發表于 08-14 18:16 ?838次閱讀
    linux<b class='flag-5'>定時任務</b>的用法總結
    主站蜘蛛池模板: 动漫美女脱小内内露尿口| 中文字幕专区高清在线观看| 亚洲国产精品久久人人爱| 99久久亚洲综合精品| 狠狠久久免费视频在线| 日本少妇内射视频播放舔| 18亚洲男同gay1069| 超碰最新地址| 老外的好大c的我好爽| 人妻无码AV中文系列| 91九色麻豆| 精品无人区麻豆乱码1区2| 欧美 另类 美腿 亚洲 无码| 一本之道高清视频在线观看| 国产精品免费久久久久影院| 久久精品亚洲牛牛影视| 小学生偷拍妈妈视频遭性教育 | 俄罗斯一级毛片aaaa| 精品少妇爆AV无码专区| 色中色成人论坛| 伊人久久精品AV一区二区| 国产免费看片| 年轻的老师5理伦片| 永久免费在线观看视频| 国精品产露脸偷拍视频| 窝窝色资源站| 国产 有码 无码 电影| 任你躁精品一区二区三区| 99精品国产第一福利网站| 国产精品自在自线亚洲| 日本综艺大尺度无删减版在线| 伊人久久大香线蕉电影院| 国产亚洲福利精品一区| 午夜理论片YY4399影院| 国产AV高清怡春院| 日本无码毛片久久久九色综合| 99久久久久亚洲AV无码| 女女破视频在线观看| 99C视频色欲在线| 免费99精品国产人妻自在线| 亚洲精品成人A8198A片漫画|