女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

SpringBoot-動(dòng)態(tài)定時(shí)任務(wù)調(diào)度

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

一、業(yè)務(wù)場(chǎng)景

先說(shuō)業(yè)務(wù)場(chǎng)景,根據(jù)用戶輸入的cron表達(dá)式進(jìn)行定時(shí)調(diào)度,舉個(gè)例子:如圖

圖片

根據(jù)用戶輸入的參數(shù),生成表達(dá)式,然后定時(shí)去執(zhí)行相應(yīng)的業(yè)務(wù)邏輯。

二、Controller層(不是重點(diǎn))

domain類

@TableName("sys_schedule")
@Data
public class Schedule {

    private static final long serialVersionUID = 1L;

    /**
     * 主鍵ID
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;

    /**
     * 類型: 時(shí)間, 周, 日
     */
    @TableField("type")
    private Integer type;

    /**
     * time 時(shí)間
     */
    @TableField("day_time")
    private String dayTime;

    /**
     * time 周
     */
    @TableField("weekday")
    private String weekday;

    /**
     * time 日
     */
    @TableField("monthday")
    private String monthday;

    /**
     * 選中狀態(tài)
     */
    @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自己封裝的響應(yīng)結(jié)果
        //param是你前端傳的,包含你的數(shù)據(jù),如cron表達(dá)式
        this.scheduleService.update(schedule);
        return ResponseData.success();
    }

三、Service層

接口

public interface ScheduleService {

    /**
     * 更新
     * @Date 2020-12-25
     */
    void update(Schedule param);

    /**
     * 業(yè)務(wù)處理
     * @Date 2020-12-25
     */
    void work();

}

實(shí)現(xiàn)層

@Service
public class ScheduleServiceImpl implements ScheduleService {
    
 @Override
    public void update(Schedule param) {
  //這里簡(jiǎn)化了我自己的業(yè)務(wù)邏輯代碼,根據(jù)公司自己需要來(lái)寫即可
        //業(yè)務(wù)邏輯代碼
        
        //思路就是:更新數(shù)據(jù)庫(kù)的cron,類型等值,然后交給下面的定時(shí)工具類走定時(shí)方法
        this.scheduleMapper.updateById(param);
        String cron = param.getCron();
        //this就是你的業(yè)務(wù)執(zhí)行service, 這里就是scheduleService
        ScheduleUtil.reset(new ScheduleTask(param.getId().toString(), this, null), cron);
    }
    
    @Override
    public void work() {
        //抓取數(shù)據(jù)的代碼
        System.out.println("業(yè)務(wù)代碼執(zhí)行。。。");
    }

    
}

四、定時(shí)工具類

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("定時(shí)任務(wù)線程池啟動(dòng)");
    }

    /**
     * 啟動(dòng)
     *
     * @param scheduleTask 定時(shí)任務(wù)
     * @param corn         執(zhí)行時(shí)間表達(dá)式
     */
    public static boolean start(ScheduleTask scheduleTask, String corn) {
        System.out.println("啟動(dòng)定時(shí)任務(wù)線程 taskId " + scheduleTask.getId());
        ScheduledFuture? scheduledFuture = threadPoolTaskScheduler
                .schedule(scheduleTask, new CronTrigger(corn));
        scheduledFutureMap.put(scheduleTask.getId(), scheduledFuture);
        return true;
    }

    /**
     * 取消
     *
     * @param scheduleTask 定時(shí)任務(wù)
     */
    public static boolean cancel(ScheduleTask scheduleTask) {
        System.out.println("關(guān)閉定時(shí)任務(wù)線程 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 定時(shí)任務(wù)
     * @param corn         執(zhí)行時(shí)間表達(dá)式
     */
    public static boolean reset(ScheduleTask scheduleTask, String corn) {
        //先取消定時(shí)任務(wù)
        cancel(scheduleTask);
        //然后啟動(dòng)新的定時(shí)任務(wù)
        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      任務(wù)ID
     * @param service 業(yè)務(wù)類
     * @param keyword 關(guān)鍵字參數(shù)
     */
    public ScheduleTask(String id, ScheduleService service) {
        this.id = id;
        this.service = service;
    }

    @Override
    public void run() {
        //你自己的業(yè)務(wù)邏輯
        service.work();
    }
}

到這里結(jié)束了,這里主要是根據(jù)前臺(tái)傳的時(shí)間,進(jìn)行生成cron,入庫(kù),執(zhí)行定時(shí)任務(wù)。但是有一個(gè)問(wèn)題,就是如果項(xiàng)目重啟了的話,那么定時(shí)類那是無(wú)法加載到cron表達(dá)式的。那么接下來(lái),加一個(gè)項(xiàng)目啟動(dòng)時(shí),把數(shù)據(jù)庫(kù)里的cron表達(dá)式重新灌入到定時(shí)類就可以。代碼如下:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

/**
 * 項(xiàng)目啟動(dòng)時(shí),加載
 * @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 ........... ");
        //這里就是獲取你數(shù)據(jù)庫(kù)里的那個(gè)cron表達(dá)式
        Schedule param = scheduleService.get();
        String cron = param.getCron();
        ScheduleUtil.reset(new ScheduleTask(param.getId().toString(), scheduleService, null), cron);
    }
}

版權(quán)聲明:本文為博主原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接和本聲明。

本文鏈接:

https://blog.csdn.net/bbscz007/article/details/111695289

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4886

    瀏覽量

    70248
  • spring
    +關(guān)注

    關(guān)注

    0

    文章

    340

    瀏覽量

    14878
  • SpringBoot
    +關(guān)注

    關(guān)注

    0

    文章

    175

    瀏覽量

    318
收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Linux系統(tǒng)定時(shí)任務(wù)Crond

    會(huì)定期(默認(rèn)每分鐘檢查一次)檢查系統(tǒng)中是否有要執(zhí)行的任務(wù)工作,如果有,便會(huì)根據(jù)其預(yù)先設(shè)定的定時(shí)任務(wù)規(guī)則自動(dòng)執(zhí)行該定時(shí)任務(wù)工作,這個(gè)crond定時(shí)任務(wù)服務(wù)就相當(dāng)于我們平時(shí)早起使用的鬧鐘一
    發(fā)表于 07-05 06:22

    OPC 實(shí)時(shí)任務(wù)系統(tǒng)動(dòng)態(tài)調(diào)度算法的研究與設(shè)計(jì)The Stud

    本文基于已有的OPC Server 實(shí)時(shí)任務(wù)模型,設(shè)計(jì)了處理混合任務(wù)集的動(dòng)態(tài)調(diào)度算法(基于截止期優(yōu)先)和實(shí)現(xiàn)方式。該算法實(shí)現(xiàn)了對(duì)混合任集可調(diào)度
    發(fā)表于 05-31 15:36 ?13次下載

    SpringBoot如何實(shí)現(xiàn)動(dòng)態(tài)增刪啟停定時(shí)任務(wù)

    這兩種方式不能動(dòng)態(tài)添加、刪除、啟動(dòng)、停止任務(wù)。 要實(shí)現(xiàn)動(dòng)態(tài)增刪啟停定時(shí)任務(wù)功能,比較廣泛的做法是集成Quartz框架。但是本人的開(kāi)發(fā)原則是:在滿足項(xiàng)目需求的情況下,盡量少的依賴其它框架
    的頭像 發(fā)表于 09-24 09:49 ?3168次閱讀
    <b class='flag-5'>SpringBoot</b>如何實(shí)現(xiàn)<b class='flag-5'>動(dòng)態(tài)</b>增刪啟停<b class='flag-5'>定時(shí)任務(wù)</b>

    Python定時(shí)任務(wù)的實(shí)現(xiàn)方式

    調(diào)度模塊schedule實(shí)現(xiàn)定時(shí)任務(wù) 利用任務(wù)框架APScheduler實(shí)現(xiàn)定時(shí)任務(wù) Job 作業(yè) Trigger 觸發(fā)器 Executor 執(zhí)行器 Jobstore 作業(yè)存儲(chǔ) Eve
    的頭像 發(fā)表于 10-08 15:20 ?8618次閱讀

    如何在SpringBoot項(xiàng)目中實(shí)現(xiàn)動(dòng)態(tài)定時(shí)任務(wù)

    之前寫過(guò)文章記錄怎么在SpringBoot項(xiàng)目中簡(jiǎn)單使用定時(shí)任務(wù),不過(guò)由于要借助cron表達(dá)式且都提前定義好放在配置文件里,不能在項(xiàng)目運(yùn)行中動(dòng)態(tài)修改任務(wù)執(zhí)行時(shí)間,實(shí)在不太靈活。
    的頭像 發(fā)表于 09-30 11:16 ?1972次閱讀

    解析Golang定時(shí)任務(wù)庫(kù)gron設(shè)計(jì)和原理

    正巧,最近看到了 gron 這個(gè)開(kāi)源項(xiàng)目,它是用 Golang 實(shí)現(xiàn)一個(gè)并發(fā)安全的定時(shí)任務(wù)庫(kù)。實(shí)現(xiàn)非常簡(jiǎn)單精巧,代碼量也不多。今天我們就來(lái)一起結(jié)合源碼看一下,怎樣基于 Golang 的能力做出來(lái)一個(gè)【定時(shí)任務(wù)庫(kù)】。
    的頭像 發(fā)表于 12-15 13:57 ?1583次閱讀

    xxl-job任務(wù)調(diào)度中間件解決定時(shí)任務(wù)調(diào)度問(wèn)題

    xxl-job是一款非常優(yōu)秀的任務(wù)調(diào)度中間件,輕量級(jí)、使用簡(jiǎn)單、支持分布式等優(yōu)點(diǎn),讓它廣泛應(yīng)用在我們的項(xiàng)目中,解決了不少定時(shí)任務(wù)調(diào)度問(wèn)題。
    的頭像 發(fā)表于 01-31 09:53 ?2588次閱讀

    求一種SpringBoot定時(shí)任務(wù)動(dòng)態(tài)管理通用解決方案

    SpringBoot定時(shí)任務(wù)的加強(qiáng)工具,實(shí)現(xiàn)對(duì)SpringBoot原生的定時(shí)任務(wù)進(jìn)行動(dòng)態(tài)管理,完全兼容原生@Scheduled注解,無(wú)需對(duì)
    的頭像 發(fā)表于 02-03 09:49 ?969次閱讀

    SpringBoot如何實(shí)現(xiàn)定時(shí)任務(wù)(下)

    SpringBoot創(chuàng)建定時(shí)任務(wù)的方式很簡(jiǎn)單,主要有兩種方式:一、基于注解的方式(@Scheduled)二、數(shù)據(jù)庫(kù)動(dòng)態(tài)配置。實(shí)際開(kāi)發(fā)中,第一種需要在代碼中寫死表達(dá)式,如果修改起來(lái),又得重啟會(huì)顯得很麻煩;所以我們往往會(huì)采取第二種方
    的頭像 發(fā)表于 04-07 14:51 ?1384次閱讀
    <b class='flag-5'>SpringBoot</b>如何實(shí)現(xiàn)<b class='flag-5'>定時(shí)任務(wù)</b>(下)

    SpringBoot如何實(shí)現(xiàn)定時(shí)任務(wù)(上)

    SpringBoot創(chuàng)建定時(shí)任務(wù)的方式很簡(jiǎn)單,主要有兩種方式:一、基于注解的方式(@Scheduled)二、數(shù)據(jù)庫(kù)動(dòng)態(tài)配置。實(shí)際開(kāi)發(fā)中,第一種需要在代碼中寫死表達(dá)式,如果修改起來(lái),又得重啟會(huì)顯得很麻煩;所以我們往往會(huì)采取第二種方
    的頭像 發(fā)表于 04-07 14:51 ?1531次閱讀
    <b class='flag-5'>SpringBoot</b>如何實(shí)現(xiàn)<b class='flag-5'>定時(shí)任務(wù)</b>(上)

    在Spring Boot中如何使用定時(shí)任務(wù)

    本文介紹在 Spring Boot 中如何使用定時(shí)任務(wù),使用非常簡(jiǎn)單,就不做過(guò)多說(shuō)明了。
    的頭像 發(fā)表于 04-12 10:56 ?1159次閱讀

    如何動(dòng)態(tài)添加修改刪除定時(shí)任務(wù)

    如何動(dòng)態(tài)添加修改刪除定時(shí)任務(wù)?那么我們一起看看具體怎么實(shí)現(xiàn),先看下本節(jié)大綱: (1)思路說(shuō)明; (2)代碼解析; (3)修改定時(shí)任務(wù)執(zhí)行周期特別說(shuō)明;
    的頭像 發(fā)表于 04-12 11:06 ?1310次閱讀

    Linux如何使用cron進(jìn)行定時(shí)任務(wù)的操作

    按計(jì)劃執(zhí)行命令對(duì)于計(jì)算機(jī)來(lái)說(shuō)非常重要,因?yàn)榧偃缥矣H自去執(zhí)行一些任務(wù)的話,可能會(huì)因?yàn)槎喾矫嬉蛩夭荒馨磿r(shí)執(zhí)行,所以定時(shí)任務(wù)就顯得非常重要了! cron就是一個(gè)能夠執(zhí)行定時(shí)任務(wù)的命令,其實(shí)該命令本身不難,下面小編帶您詳細(xì)了解!
    的頭像 發(fā)表于 05-12 16:27 ?2263次閱讀

    python定時(shí)任務(wù)實(shí)踐

    由于程序需求,監(jiān)測(cè)配置變化需要設(shè)置定時(shí)任務(wù),每分鐘執(zhí)行一次,對(duì)任務(wù)持久化要求不高,不需要時(shí)可以關(guān)閉定時(shí)任務(wù)
    的頭像 發(fā)表于 05-20 17:53 ?1127次閱讀
    python<b class='flag-5'>定時(shí)任務(wù)</b>實(shí)踐

    linux定時(shí)任務(wù)的用法總結(jié)

    習(xí)慣了使用 windows 的計(jì)劃任務(wù),使用 linux 中的 crontab 管理定時(shí)任務(wù)時(shí)很不適應(yīng)。
    的頭像 發(fā)表于 08-14 18:16 ?1075次閱讀
    linux<b class='flag-5'>定時(shí)任務(wù)</b>的用法總結(jié)