欧美性猛交xxxx免费看_牛牛在线视频国产免费_天堂草原电视剧在线观看免费_国产粉嫩高清在线观看_国产欧美日本亚洲精品一5区

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

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

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

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

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

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

@Slf4j
 @Service
 public class ScheduledTaskServiceImpl implements ScheduledTaskService {
 
     /**
      * 可重入鎖
      */
    private ReentrantLock lock = new ReentrantLock();
 
     /**
      * 定時(shí)任務(wù)線程池
      */
     @Autowired
     private ThreadPoolTaskScheduler threadPoolTaskScheduler;
 
     /**
      * 啟動(dòng)狀態(tài)的定時(shí)任務(wù)集合
      */
     public Map<String, ScheduledFuture> scheduledFutureMap = new ConcurrentHashMap<>();
 
     @Autowired
     private ScheduledJobService scheduledJobService;
 
     @Override
     public Boolean start(ScheduledJob scheduledJob) {
         String jobKey = scheduledJob.getJobKey();
         log.info("啟動(dòng)定時(shí)任務(wù)"+jobKey);
         //添加鎖放一個(gè)線程啟動(dòng),防止多人啟動(dòng)多次
         lock.lock();
         log.info("加鎖完成");
 
         try {
             if(this.isStart(jobKey)){
                 log.info("當(dāng)前任務(wù)在啟動(dòng)狀態(tài)中");
                 return false;
             }
             //任務(wù)啟動(dòng)
             this.doStartTask(scheduledJob);
         } finally {
             lock.unlock();
             log.info("解鎖完畢");
         }
 
         return true;
     }
 
     /**
      * 任務(wù)是否已經(jīng)啟動(dòng)
      */
     private Boolean isStart(String taskKey) {
         //校驗(yàn)是否已經(jīng)啟動(dò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)前實(shí)例是否存在 "+flag);
         if(flag){
             ScheduledFuture scheduledFuture = scheduledFutureMap.get(jobKey);
 
             scheduledFuture.cancel(true);
 
             scheduledFutureMap.remove(jobKey);
         }
         return flag;
     }
 
     @Override
     public Boolean restart(ScheduledJob scheduledJob) {
         log.info("重啟定時(shí)任務(wù)"+scheduledJob.getJobKey());
         //停止
         this.stop(scheduledJob.getJobKey());
 
         return this.start(scheduledJob);
     }
 
     /**
      * 執(zhí)行啟動(dòng)任務(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(), "定時(shí)任務(wù)類必須實(shí)現(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 表操作對(duì)應(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> {
 
     /**
      * 修改定時(shí)任務(wù),并重新啟動(dòng)
      * @param scheduledJob
      * @return
      */
     boolean updateOne(ScheduledJob scheduledJob);
 }
@Service
 @Slf4j
 public class ScheduledJobServiceImpl extends ServiceImpl

2.10 修改定時(shí)任務(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、測(cè)試結(jié)果

3.1 啟動(dòng)項(xiàng)目,看下定時(shí)任務(wù)的執(zhí)行結(jié)果,控制臺(tái)輸出結(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)不變

圖片

圖片

圖片

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

圖片

3.2.1 修改狀態(tài)

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

圖片

最后

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

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

如果覺(jué)得寫得還不錯(cuò)的話,給個(gè)推薦鼓勵(lì)一下吧。

聲明:本文內(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

    文章

    4837

    瀏覽量

    69126
  • spring
    +關(guān)注

    關(guān)注

    0

    文章

    340

    瀏覽量

    14398
  • Boot
    +關(guān)注

    關(guān)注

    0

    文章

    150

    瀏覽量

    35961
  • SpringBoot
    +關(guān)注

    關(guān)注

    0

    文章

    174

    瀏覽量

    201
收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

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

    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

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

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

    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 ?3010次閱讀
    <b class='flag-5'>SpringBoot</b>如何<b class='flag-5'>實(shí)現(xiàn)</b>動(dòng)態(tài)增刪啟停<b class='flag-5'>定時(shí)任務(wù)</b>

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

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

    如何在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 ?1852次閱讀

    解析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 的
    的頭像 發(fā)表于 12-15 13:57 ?1400次閱讀

    求一種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 ?837次閱讀

    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ì)采取第二種方式,可以直接從數(shù)據(jù)庫(kù)中讀取
    的頭像 發(fā)表于 04-07 14:51 ?1402次閱讀
    <b class='flag-5'>SpringBoot</b>如何<b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>定時(shí)任務(wù)</b>(上)

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

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

    如何動(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 ?1138次閱讀

    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 ?2106次閱讀

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

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

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

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

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

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