精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

SpringBoot3優雅停止/重啟定時任務

開發 前端
在Spring Boot中,使用@Scheduled注解可以方便地創建定時任務。然而,隨著應用程序的復雜性和運維需求的增加,動態管理這些定時任務成為了一個重要的問題。針對這種動態管理定時任務Spring Boot中并沒有提供相應的實現,所以就需要我們自己動手來實現定時任務的管理。

環境:SpringBoot3.2.5

1. 簡介

在Spring Boot中,使用@Scheduled注解可以方便地創建定時任務。然而,隨著應用程序的復雜性和運維需求的增加,動態管理這些定時任務成為了一個重要的問題。針對這種動態管理定時任務Spring Boot中并沒有提供相應的實現,所以就需要我們自己動手來實現定時任務的管理。

2. 執行原理

首先,我們要搞清楚Spring Boot定時任務的執行原理,其核心先通過ScheduledAnnotationBeanPostProcessor處理器,找到所有的Bean中使用了@Scheduled注解的方法,然后將對應的方法包裝到Runnable中。

public class ScheduledAnnotationBeanPostProcessor {
  public Object postProcessAfterInitialization(Object bean, String beanName) {
    // 找到符合條件的方法
    Map<Method, Set<Scheduled>> annotatedMethods = MethodIntrospector.selectMethods(targetClass,
      (MethodIntrospector.MetadataLookup<Set<Scheduled>>) method -> {
        Set<Scheduled> scheduledAnnotations = AnnotatedElementUtils.getMergedRepeatableAnnotations(
            method, Scheduled.class, Schedules.class);
        return (!scheduledAnnotations.isEmpty() ? scheduledAnnotations : null);
      });
    // 處理方法,在processScheduled方法中會將任務包裝成ScheduledMethodRunnable對象
    annotatedMethods.forEach((method, scheduledAnnotations) ->
      scheduledAnnotations.forEach(scheduled -> processScheduled(scheduled, method, bean))); 
  }
}

接下來,就是通過TaskScheduler來執行定時任務,該接口提供了一些列的方法:

public interface TaskScheduler {
  // 這些調用任務都返回了Future
  ScheduledFuture<?> schedule(Runnable task, Trigger trigger) ;


  ScheduledFuture<?> schedule(Runnable task, Instant startTime);


  ScheduledFuture<?> scheduleAtFixedRate(Runnable task, Instant startTime, Duration period);


  // 還有其它方法。
}

在默認情況下,Spring Boot定時任務的執行線程池使用的是ThreadPoolTaskSchedulerBean。內部真正任務調用是通過ScheduledExecutorService執行定時任務。

所以,要實現動態管理任務,就需要記錄下每個任務信息。記錄任務信息是為了停止任務及再次啟動任務,在上面的調度方法都返回了Future對象,可以通過該Future對象來終止任務,可以通過再次調用schedule方法來再次啟動任務。所以,我們需要自定義TaskScheduler,在自定義的實現中我們就能很方便的記錄管理每個定時任務。

3. 實戰案例

要管理任務,我們就必須為每個任務提供一個有意義的名稱。@Scheduled注解并沒有提供此功能。所以這塊功能,需要自己實現。

3.1 自定義@Task注解

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Task {
  /**任務名稱*/
  String value() default "" ;
}

該注解用來對任務的說明。

3.2 任務信息TaskInfo

public class TaskInfo {
  private Runnable task ;
  private Instant startTime ;
  private Trigger trigger ;
  private Duration period ;
  private Duration delay ;
  private ScheduledFuture<?> future ;
}

該類用來在執行任務前記錄當前的信息,以便可以對任務進行停止和重啟。

3.3 自定義線程池

@Component
public class PackTaskScheduler extends ThreadPoolTaskScheduler {
  
  private static final Map<String, TaskInfo> TASK = new ConcurrentHashMap<>() ;
  @Override
  public ScheduledFuture<?> schedule(Runnable task, Trigger trigger) {
    ScheduledFuture<?> schedule = super.schedule(task, trigger) ;
    if (task instanceof ScheduledMethodRunnable smr) {
      String taskName = parseTask(smr);
      TASK.put(taskName, new TaskInfo(task, null, trigger, null, null, schedule)) ;
    }
    return schedule ;
  }
  // 還有其它重寫的方法,自行實現
  private String parseTask(ScheduledMethodRunnable smr) {
    Method method = smr.getMethod();
    Task t = method.getAnnotation(Task.class) ;
    String taskName = method.getName() ; 
    if (t != null) {
      String value = t.value() ;
      if (StringUtils.hasLength(value)) {
        taskName = value ;
      }
    }
    return taskName ;
  }


  public void stop(String taskName) {
    TaskInfo task = TASK.get(taskName) ;
    if (task != null) {
      task.getFuture().cancel(true) ;
    }
  }
  public void start(String taskName) {
    TaskInfo task = TASK.get(taskName) ;
    if (task != null) {
      if (task.trigger != null) {
        this.schedule(task.getTask(), task.getTrigger()) ;
      }
      if (task.period != null) {
        this.scheduleAtFixedRate(task.getTask(), task.getPeriod()) ;
      }
    }
  }
}

該類的核心作用就2個:1. 重寫任務調度方法,記錄任務信息2. 添加停止/重啟任務調度也可以考慮在該類中實現任務的持久化。

以上就完成了所有的核心操作。接下來寫2個方法進行測試。

3.4 測試

定時任務

@Scheduled(cron = "*/3 * * * * *")
@Task("測試定時任務-01")
public void scheduler() throws Exception {
  System.err.printf("當前時間: %s, 當前線程: %s, 是否虛擬線程: %b%n", new SimpleDateFormat("HH:mm:ss").format(new Date()), Thread.currentThread().getName(), Thread.currentThread().isVirtual()) ;
}

停止/重啟接口

private final PackTaskScheduler packTaskScheduler ;
public SchedulerController(PackTaskScheduler packTaskScheduler) {
  this.packTaskScheduler = packTaskScheduler ;
}
@GetMapping("stop")
public Object stop(String taskName) {
  this.packTaskScheduler.stop(taskName) ;
  return String.format("停止任務【%s】成功", taskName) ;
}
@GetMapping("/start") 
public Object start(String taskName) {
  this.packTaskScheduler.start(taskName) ;
  return String.format("啟動任務【%s】成功", taskName) ; 
}

分別調用上面2個方法可以對具體的任務進行停止及重啟。

責任編輯:武曉燕 來源: Spring全家桶實戰案例源碼
相關推薦

2024-09-03 10:44:32

2025-02-24 16:00:00

SpringBoot定時任務開發

2019-02-20 15:52:50

技術開發代碼

2024-02-28 09:54:07

線程池配置

2017-08-16 16:41:04

JavaSpringBoot定時任務

2024-09-20 05:49:04

SpringBoot后端

2023-08-07 14:28:07

SpringBoot工具

2025-04-21 02:20:00

2010-03-10 15:47:58

crontab定時任務

2009-10-28 10:05:29

Ubuntucrontab定時任務

2012-02-07 13:31:14

SpringJava

2023-01-04 09:23:58

2024-09-09 08:11:12

2023-08-09 08:29:51

SpringWeb編程

2024-12-27 08:24:55

2020-12-21 07:31:23

實現單機JDK

2010-01-07 13:38:41

Linux定時任務

2021-06-30 07:19:34

SpringBoot定時任務

2023-10-31 12:42:00

Spring動態增刪啟停

2024-11-04 16:01:01

點贊
收藏

51CTO技術棧公眾號

国产淫片在线观看| 中文字幕亚洲精品在线| 黄色精品视频| 国产精品拍天天在线| 国产日韩在线看片| 免费无遮挡无码永久在线观看视频 | 久久天天东北熟女毛茸茸| 国产激情视频在线播放| 另类亚洲自拍| 久久久av亚洲男天堂| 欲求不满的岳中文字幕| 国产精品2区| 欧美日韩在线影院| wwwjizzjizzcom| 日本不卡视频一区二区| 国产麻豆精品在线观看| 日韩av第一页| 久久午夜无码鲁丝片午夜精品| 蜜臀91精品国产高清在线观看| 欧美一区二区成人| 999在线免费视频| av资源在线播放| 亚洲天堂久久久久久久| 欧美午夜免费| 丰满少妇高潮在线观看| 久久精品国产99国产精品| 18性欧美xxxⅹ性满足| 国产免费久久久久| 国产一区二区欧美| 亚洲精品国偷自产在线99热| 日日夜夜精品视频免费观看| 久久久人成影片一区二区三区在哪下载 | 日韩主播视频在线| 久久男人av资源网站| 亚洲AV成人无码精电影在线| 国产精品一区二区三区av麻| 亚洲国产天堂久久综合网| 欧美视频亚洲图片| 日本久久一区| 欧美三级视频在线播放| 92看片淫黄大片一级| 国产精品yjizz视频网| 亚洲精品一卡二卡| 99re99热| 日本电影全部在线观看网站视频| 久久精品一区二区三区不卡| 精品在线视频一区二区| 三级视频在线看| 丁香天五香天堂综合| 91久久极品少妇xxxxⅹ软件| 国产精品呻吟久久| 麻豆精品久久精品色综合| 日本久久久久久久久久久| 精品成人久久久| 日韩午夜黄色| 91国产在线精品| 综合激情网五月| 美女尤物久久精品| 日韩av电影在线播放| 日本黄色一级视频| 日韩精品视频网| 国产精品色视频| 亚洲在线观看av| 国产在线精品一区二区夜色| 91亚洲精品在线观看| 国产精品一级视频| 国产成a人无v码亚洲福利| 国产精品免费一区二区| 神马久久久久久久久久| 久久亚洲一区二区三区明星换脸| 免费电影一区| 成年人视频在线观看免费| 国产精品天干天干在观线| 宅男av一区二区三区| 26uuu亚洲电影在线观看| 一区二区三区四区高清精品免费观看| 被灌满精子的波多野结衣| 国产精品—色呦呦| 黑人巨大精品欧美一区二区三区| aaa毛片在线观看| 国产精品久久久久久久久免费高清| 欧美日本在线看| 国产精品19p| 亚洲婷婷影院| 日韩中文字幕视频| 免费视频网站www| 国产农村妇女精品一二区| 国产噜噜噜噜久久久久久久久| 国产尤物在线观看| 不卡av在线免费观看| 日韩在线导航| av网站导航在线观看免费| 婷婷综合在线观看| 色国产在线视频| av成人资源| 亚洲欧美精品一区| 99久久婷婷国产综合| 99国产一区| 成人精品久久久| 天天操天天操天天干| 国产农村妇女精品| 欧美一级免费播放| 久久免费资源| 亚洲精品久久久久久下一站 | 亚洲日本va午夜在线影院| 欧美激情视频免费看| 久久精品黄色| 亚洲精品电影久久久| 日韩av手机在线免费观看| 亚洲欧洲视频| 成人免费在线网址| 久久这里精品| 亚洲精品国产成人久久av盗摄 | 漫画在线观看av| 欧美性大战久久| 亚洲视频在线播放免费| 91麻豆国产自产在线观看亚洲| 91精品国产色综合久久不卡98口| 91亚洲欧美激情| 久久久青草青青国产亚洲免观| 国产又粗又长又爽视频| 另类一区二区三区| 亚洲美女免费精品视频在线观看| 久久久久久久久97| 理论电影国产精品| 性高潮久久久久久久久| 亚洲黄色中文字幕| 亚洲第一天堂av| 久久国产精品波多野结衣av| 久久国内精品自在自线400部| 欧美精品成人一区二区在线观看| 牛牛在线精品视频| 欧美一卡在线观看| 精品无码久久久久成人漫画 | 国产精品777| 天天操天天干天天舔| 樱桃视频在线观看一区| 天堂av8在线| 欧美国产美女| 国产精品视频xxxx| 久久久久高清| 亚洲国产一二三区| 亚洲免费在线视频一区 二区| 虎白女粉嫩尤物福利视频| 久久aimee| 97国产真实伦对白精彩视频8| 亚洲AV无码精品色毛片浪潮| 亚洲精品伦理在线| 少妇愉情理伦片bd| 中文字幕一区二区av | 91丨精品丨国产| 中文字幕无线精品亚洲乱码一区 | 日韩视频一区二区三区在线播放| 天天鲁一鲁摸一摸爽一爽| 久久机这里只有精品| 伊人av成人| 99er精品视频| 久久综合88中文色鬼| 91在线精品入口| 日韩美女精品在线| 亚洲一区二区中文字幕在线观看| 天天综合网91| 亚洲自拍偷拍一区| 日韩特级毛片| 亚洲国产三级网| 人妻丰满熟妇av无码区| 国产欧美视频在线观看| 亚洲精品www.| 亚洲手机在线| 麻豆精品传媒视频| 国产极品久久久久久久久波多结野| 中文字幕av一区| 国产探花精品一区二区| 一二三区精品视频| 中文字幕av观看| 日本不卡视频在线观看| 国产成年人在线观看| 6080亚洲理论片在线观看| 欧美孕妇毛茸茸xxxx| 国产福利第一视频在线播放| 欧美片网站yy| 日本三级欧美三级| 国产欧美一区视频| 国产精品久久久久久久av福利| 欧美成人有码| 另类欧美小说| 亚洲成人精品综合在线| 久久久久中文字幕| 天天综合天天色| 欧美亚洲国产一区在线观看网站| 婷婷社区五月天| www.亚洲激情.com| 天天综合网日韩| 在线观看欧美亚洲| 美国一区二区| 成人妇女免费播放久久久| 超碰99在线| 国产精品三级电影| 亚洲一区二区三区中文字幕在线| 福利二区91精品bt7086| 午夜av一区二区三区| 日韩毛片精品高清免费| 日本精品一级二级| 69堂国产成人免费视频| 日韩精品中文字幕在线一区| 亚洲欧美另类自拍| 久久影视免费观看| 91po在线观看91精品国产性色| 2019中文字幕在线观看| 国产精品日韩专区| 岛国一区二区三区高清视频| 妺妺窝人体色www看人体| 手机看片一级片| 日本免费www| 亚洲天堂久久久久| 日本精品在线| 国产精品流白浆在线观看| 亚洲精品专区| 成人av在线电影| 欧美视频在线观看免费网址| 在线观看国产成人av片| 亚洲2020天天堂在线观看| 日产精品一线二线三线芒果| 性囗交免费视频观看| 你懂的国产视频| 另类视频在线| 夜久久久久久| 国产日韩欧美亚洲| 最近2019中文免费高清视频观看www99| 欧美激情在线狂野欧美精品| 精品蜜桃传媒| 日本精品www| 国产一二三四区| 天堂中文在线官网| 欧美在线se| 麻豆91精品视频| 亚洲精品一卡二卡| 欧美精品一二三区| 亚洲三级av在线| 国产精品久久一区| 欧美三级网色| 男人天堂999| 亚洲成人日韩在线| 国产亚洲欧美精品久久久www| sm国产在线调教视频| 亚洲欧美日韩视频二区| 欧美r级电影在线观看| 亚洲成色www久久网站| 中文字幕在线2021| 在线天堂资源| 极品中文字幕一区| av网站一区二区三区| 最新中文字幕一区二区三区| 欧美日韩国产一区在线| 中文字幕精品一区久久久久| 91免费在线视频| 日韩手机在线观看视频| 久久综合激情网| 一区二区三区免费在线视频| 国内在线精品| 国产精品片aa在线观看| 国产精品一区亚洲| 国产精品久久久久久亚洲毛片| 欧美三级资源在线| 久久久久国产视频| 免费看国产精品一二区视频| 看看黄色一级片| 国产老女人乱淫免费| 国产suv精品一区二区四区视频| 国产精品成人自拍| 久久日韩粉嫩一区二区三区 | 2019国产精品视频| 日本少妇激三级做爰在线| 亚洲图片小说视频| 乱亲女h秽乱长久久久| 丰满岳乱妇一区二区三区| 亚洲成人av资源网| 日本精品二区| 日韩精品国内| 国产吃瓜黑料一区二区| 波多野结衣免费观看| av网站在线免费看| 猛男gaygay欧美视频| 中文字幕人成不卡一区| 午夜精品久久17c| 自拍偷拍21p| 水中色av综合| 日韩欧美一级| 2023国产精品| 欧美黄色www| 8x8x成人免费视频| 青青青免费视频在线2| 中文字幕一区二区av| 欧美在线色视频| 国产在线精品一区二区三区| 香蕉久久久久久久| 香蕉久久免费电影| 99国内精品久久| 欧美高清电影在线看| 国产一级片自拍| 9191在线| 麻豆国产精品视频| 一区二区中文字幕| 一本色道无码道dvd在线观看| 免费a级片在线观看| 国产精品扒开腿做爽爽爽软件| 欧美另类变人与禽xxxxx| 日韩亚洲视频| 亚洲美女性囗交| 国产又黄又粗又长| 99精品视频精品精品视频| 欧美日韩中文字幕一区二区| 亚洲成人一区二区三区| 国产主播第一页| 国产成人精选| 国产精品国模大尺度视频| 国产噜噜噜噜噜久久久久久久久| 人妻熟人中文字幕一区二区| 日本.亚洲电影| 亚洲视频网在线直播| 国产福利久久| 欧美成人一区二区三区四区| 第四色成人网| 欧美一二三四在线| 被灌满精子的波多野结衣| 亚洲av成人无码久久精品老人 | 欧美亚洲色综久久精品国产| av在线一区不卡| 亚洲欧美aⅴ...| 麻豆一区区三区四区产品精品蜜桃| 精品久久久久久久久久久国产字幕 | 美丽的姑娘在线观看免费动漫| 欧美一级久久| 久久久久久久久久久成人| 扒开jk护士狂揉免费| 国产厕拍一区| 欧美人狂配大交3d怪物一区| av7777777| av在线免费观看网址| 久久综合资源网| 日本在线播放一区| 日本免费一区视频| 国产一区二区调教| 国产成人精品久久久| 在线看成人av| 好吊视频一区二区三区四区| 色播久久人人爽人人爽人人片视av| 国产午夜在线一区二区三区| 亚洲日日夜夜| 欧美日韩精品电影| 国产高清精品在线观看| 波多野结衣精品| 亚洲精品国产一区二区精华液| 一区在线电影| 嫩草在线视频| 中文字幕一区二区三| 日韩av大全| 在线视频91p| 国产精品亲子乱子伦xxxx裸| 深田咏美在线x99av| av资源网站在线观看| 欧美国产日韩精品免费观看| 亚洲男人天堂手机在线| 成人一区二区三| 欧美精品高清| 欧美蜜桃一区二区三区| 日本高清一区二区视频| 国产视频网站一区二区三区| 精品奇米国产一区二区三区| 欧产日产国产精品98| 亚洲人和日本人hd| 在线观看久久av| 99热精品免费| 亚洲一区二区动漫| 国产视频999| 午夜精品在线播放| av资源站一区| 亚洲免费在线精品一区| a在线免费观看| 欧美日韩午夜视频在线观看| 日韩一级片播放| 在线一区二区三区视频| 中文一区二区视频| 亚洲精品国产精品乱码| 国产精品自在在线| 日韩欧美国产二区| 日本不卡1234视频| 日韩美一区二区三区| 中文字幕av久久爽一区| 国产日韩欧美在线播放不卡| 18成人免费观看网站下载| 欧美美女色图| 精品女同一区二区三区在线播放| 午夜诱惑痒痒网| 日韩理论片av| 国产精品99久久久久久久久| 三级av在线| 精品久久久久久久久久| 香港三日本8a三级少妇三级99| 欧美日本一区二区视频在线观看|