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

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

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

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

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

jf_78858299 ? 來源:博客園 ? 作者:Jae1995 ? 2023-04-07 14:51 ? 次閱讀

2.6 定時任務(wù)管理實現(xiàn)類

@Slf4j
 @Service
 public class ScheduledTaskServiceImpl implements ScheduledTaskService {
 
     /**
      * 可重入鎖
      */
    private ReentrantLock lock = new ReentrantLock();
 
     /**
      * 定時任務(wù)線程池
      */
     @Autowired
     private ThreadPoolTaskScheduler threadPoolTaskScheduler;
 
     /**
      * 啟動狀態(tài)的定時任務(wù)集合
      */
     public Map<String, ScheduledFuture> scheduledFutureMap = new ConcurrentHashMap<>();
 
     @Autowired
     private ScheduledJobService scheduledJobService;
 
     @Override
     public Boolean start(ScheduledJob scheduledJob) {
         String jobKey = scheduledJob.getJobKey();
         log.info("啟動定時任務(wù)"+jobKey);
         //添加鎖放一個線程啟動,防止多人啟動多次
         lock.lock();
         log.info("加鎖完成");
 
         try {
             if(this.isStart(jobKey)){
                 log.info("當(dāng)前任務(wù)在啟動狀態(tài)中");
                 return false;
             }
             //任務(wù)啟動
             this.doStartTask(scheduledJob);
         } finally {
             lock.unlock();
             log.info("解鎖完畢");
         }
 
         return true;
     }
 
     /**
      * 任務(wù)是否已經(jīng)啟動
      */
     private Boolean isStart(String taskKey) {
         //校驗是否已經(jīng)啟動
         if (scheduledFutureMap.containsKey(taskKey)) {
             if (!scheduledFutureMap.get(taskKey).isCancelled()) {
                 return true;
             }
         }
         return false;
     }
 
     @Override
     public Boolean stop(String jobKey) {
         log.info("停止任務(wù) "+jobKey);
         boolean flag = scheduledFutureMap.containsKey(jobKey);
         log.info("當(dāng)前實例是否存在 "+flag);
         if(flag){
             ScheduledFuture scheduledFuture = scheduledFutureMap.get(jobKey);
 
             scheduledFuture.cancel(true);
 
             scheduledFutureMap.remove(jobKey);
         }
         return flag;
     }
 
     @Override
     public Boolean restart(ScheduledJob scheduledJob) {
         log.info("重啟定時任務(wù)"+scheduledJob.getJobKey());
         //停止
         this.stop(scheduledJob.getJobKey());
 
         return this.start(scheduledJob);
     }
 
     /**
      * 執(zhí)行啟動任務(wù)
      */
     public void doStartTask(ScheduledJob sj){
         log.info(sj.getJobKey());
         if(sj.getStatus().intValue() != 1)
             return;
         Class? clazz;
         ScheduledOfTask task;
         try {
             clazz = Class.forName(sj.getJobKey());
             task = (ScheduledOfTask) SpringContextUtil.getBean(clazz);
         } catch (ClassNotFoundException e) {
             throw new IllegalArgumentException("spring_scheduled_cron表數(shù)據(jù)" + sj.getJobKey() + "有誤", e);
         }
         Assert.isAssignable(ScheduledOfTask.class, task.getClass(), "定時任務(wù)類必須實現(xiàn)ScheduledOfTask接口");
         ScheduledFuture scheduledFuture = threadPoolTaskScheduler.schedule(task,(triggerContext -> new CronTrigger(sj.getCronExpression()).nextExecutionTime(triggerContext)));
         scheduledFutureMap.put(sj.getJobKey(),scheduledFuture);
     }
 
     @Override
     public void initTask() {
         List

2.8 上面用到的獲取Bean的工具類SpringContextUtil

@Component
 public class SpringContextUtil implements ApplicationContextAware {
 
 
     private static ApplicationContext applicationContext = null;
     @Override
     public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
         if(SpringContextUtil.applicationContext == null){
             SpringContextUtil.applicationContext  = applicationContext;
         }
     }
 
     public static ApplicationContext getApplicationContext() {
         return applicationContext;
     }
 
     public static Object getBean(String name){
         return getApplicationContext().getBean(name);
     }
 
     public static

2.9 表操作對應(yīng)的一些類

Pojo

@Data
 @TableName("scheduled_job")
 public class ScheduledJob {
 
     @TableId(value = "job_id",type = IdType.AUTO)
     private Integer jobId;
 
     private String jobKey;
 
     private String cronExpression;
 
     private String taskExplain;
 
     private Integer status;
 
 }

ScheduledJobMapper

public interface ScheduledJobMapper extends BaseMapper<ScheduledJob> {
 }

ScheduledJobService

public interface ScheduledJobService extends IService<ScheduledJob> {
 
     /**
      * 修改定時任務(wù),并重新啟動
      * @param scheduledJob
      * @return
      */
     boolean updateOne(ScheduledJob scheduledJob);
 }
@Service
 @Slf4j
 public class ScheduledJobServiceImpl extends ServiceImpl

2.10 修改定時任務(wù)的接口

@RestController
 @RequestMapping("/job")
 public class ScheduledJobController {
 
     @Autowired
     private ScheduledJobService scheduledJobService;
 
     @PostMapping(value = "/update")
     public CallBackResult update(HttpServletRequest request, ScheduledJob scheduledJob){
          if(scheduledJobService.updateOne(scheduledJob))
              return new CallBackResult(true,"修改成功");
          return new CallBackResult(false,"修改失敗");
     }
 
 }

3、測試結(jié)果

3.1 啟動項目,看下定時任務(wù)的執(zhí)行結(jié)果,控制臺輸出結(jié)果

圖片

我們可以看到任務(wù)1是每5秒執(zhí)行一次,任務(wù)2是12秒執(zhí)行一次

3.2 修改任務(wù)1的cron參數(shù)或者狀態(tài)

3.2.1 修改cron,執(zhí)行周期改為20秒執(zhí)行一次,狀態(tài)不變

圖片

圖片

圖片

再看控制臺輸出結(jié)果,任務(wù)2沒變化,任務(wù)1由5秒一次變成了20秒一次了

圖片

3.2.1 修改狀態(tài)

再看控制臺輸出結(jié)果,任務(wù)2沒變化,任務(wù)1已經(jīng)不再執(zhí)行了

圖片

最后

第二種方式支持通過接口的方式去改動,并且不需要重啟,當(dāng)然啦,也可以直接在數(shù)據(jù)庫中添加或修改數(shù)據(jù)后重啟項目,配置更加靈活一點。

如果是一個固定的需求,執(zhí)行周期一定不會變的了,推薦還是第一種寫法,畢竟簡單嘛。

如果覺得寫得還不錯的話,給個推薦鼓勵一下吧。

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

    關(guān)注

    30

    文章

    4779

    瀏覽量

    68525
  • spring
    +關(guān)注

    關(guān)注

    0

    文章

    340

    瀏覽量

    14338
  • Boot
    +關(guān)注

    關(guān)注

    0

    文章

    149

    瀏覽量

    35823
  • SpringBoot
    +關(guān)注

    關(guān)注

    0

    文章

    173

    瀏覽量

    177
收藏 人收藏

    評論

    相關(guān)推薦

    關(guān)于stm32系統(tǒng)定時任務(wù)的問題

    選取的還是計算得到的?就是他怎么知道在 1ms的時候做這個任務(wù),在2ms的時候做另一個,而且沒有3ms 的定時任務(wù)?還有就是什么情況需要使用這種系統(tǒng)循環(huán)任務(wù)
    發(fā)表于 10-10 23:43

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

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

    定時任務(wù)的發(fā)展史是怎么樣的

    定時任務(wù)是互聯(lián)網(wǎng)行業(yè)里最常用的服務(wù)之一,本文給大家介紹定時任務(wù)在我司的發(fā)展歷程。 linux系統(tǒng)中一般使用crontab命令來實現(xiàn),在Java世界里,使用最廣泛的就是quartz了。我司
    發(fā)表于 07-18 17:38 ?0次下載
    <b class='flag-5'>定時任務(wù)</b>的發(fā)展史是怎么樣的

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

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

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

    在日常工作中,我們常常會用到需要周期性執(zhí)行的任務(wù),一種方式是采用 Linux 系統(tǒng)自帶的 crond 結(jié)合命令行實現(xiàn)。另外一種方式是直接使用Python。接下來整理的是常見的Python定時任務(wù)
    的頭像 發(fā)表于 10-08 15:20 ?5725次閱讀

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    python定時任務(wù)實踐

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

    定時器如何實現(xiàn)定時任務(wù)

    1.1、單次定時任務(wù)實現(xiàn) boost 的asio庫里有幾個定時器,老的有 deadline_timer , 還有三個可配合 C++11 的 chrono
    的頭像 發(fā)表于 11-09 17:20 ?944次閱讀

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

    習(xí)慣了使用 windows 的計劃任務(wù),使用 linux 中的 crontab 管理定時任務(wù)時很不適應(yīng)。
    的頭像 發(fā)表于 08-14 18:16 ?838次閱讀
    linux<b class='flag-5'>定時任務(wù)</b>的用法總結(jié)
    主站蜘蛛池模板: 老司机亚洲精品影院在线观看| 亚洲欧美在无码片一区二区| s8sp视频高清在线播放| 久久中文字幕综合不卡一二区 | 欧美日韩免费看| 51久久夜色精品国产| 久久精品免费观看久久| 亚洲偷自拍精品视频在线观看 | 男生脱美女内裤内衣动态图| 真实处破女全过程完免费观看 | 色情在线avav| 成人啪啪色婷婷久色社区| 国产成人综合在线视频| 秋霞影院福利电影| good神马电影伦理午夜| 女人吃男人的鸡鸡| 99久免费精品视频在线观看2| 美女被触手注入精子强制受孕漫画| 尤物国产在线精品三区| 久久精品国产午夜伦班片| 一区二区三区高清视频| 精品国产乱码久久久久久下载 | babesvideos性欧美| 免费视频网站嗯啊轻点| 99RE6国产精品视频播放| 嗯好大好猛皇上好深用力| 99热这里只有 精品| 欧美熟妇互舔20p| wankz tv videos国产| 人妻熟女斩五十路0930| 成人中文字幕在线观看| 色姐妹久久综合在线av| 国产成人免费在线观看| 小柔的性放荡羞辱日记| 国际老妇高清在线观看| 一二三四在线观看韩国| 快播苍井空| free18sex性自拍裸舞| 日本人六九视频| 国产免费变态视频网址网站| 亚洲国产精品天堂在线播放|