激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - Spring Task 動態(tài)修改任務(wù)執(zhí)行計(jì)劃cron方式

Spring Task 動態(tài)修改任務(wù)執(zhí)行計(jì)劃cron方式

2022-03-08 14:07疊影 Java教程

這篇文章主要介紹了Spring Task 動態(tài)修改任務(wù)執(zhí)行計(jì)劃cron方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

Spring Task 動態(tài)修改任務(wù)執(zhí)行計(jì)劃cron

Spring Task 能夠在不重啟服務(wù)的情況下,動態(tài)修改批量任務(wù)執(zhí)行時(shí)間。

原理

Spring Task目前僅支持TriggerContext上修改下次執(zhí)行時(shí)間(批量任務(wù)執(zhí)行后回調(diào)SchedulingConfigurer.configureTasks,讓用戶可以重新設(shè)置Trigger,從而動態(tài)修改下次執(zhí)行時(shí)間)),這種方法的弊端就是“執(zhí)行時(shí)間不能實(shí)時(shí)生效”。

為此,看了下task文檔,感覺若要實(shí)現(xiàn)實(shí)時(shí)生效功能,必須代碼里手工啟動/停止Spring task任務(wù)。

Demo如下

首先,xml里不需要配置springTask相關(guān)的executor和scheduler。其次,在代碼里自定義scheduler和taskRegistrar(SpringTask啟動的類)。最后,開個(gè)線程,模擬動態(tài)修改cron表達(dá)式的接口。

Spring Task 動態(tài)修改任務(wù)執(zhí)行計(jì)劃cron方式

輸出如下:(35min沒有執(zhí)行原task)

INFO 27-11 14:34:10,476 - Initializing ExecutorService
INFO 27-11 14:34:10,484 - nextExecutionTime: 0 35 14 * * ?
修改cron為: 0 36 14 * * ?
INFO 27-11 14:34:20,487 - Initializing ExecutorService
INFO 27-11 14:34:20,488 - nextExecutionTime: 0 36 14 * * ?
INFO 27-11 14:36:00,001 - dynamicCronTask is running...
INFO 27-11 14:36:00,001 - nextExecutionTime: 0 36 14 * * ?

Spring @Scheduled定時(shí)任務(wù)動態(tài)修改cron參數(shù)

  • 在定時(shí)任務(wù)類上增加@EnableScheduling注解,并實(shí)現(xiàn)SchedulingConfigurer接口。(注意低版本無效)
  • 設(shè)置一個(gè)靜態(tài)變量cron,用于存放任務(wù)執(zhí)行周期參數(shù)。
  • 另辟一線程,用于模擬實(shí)際業(yè)務(wù)中外部原因修改了任務(wù)執(zhí)行周期。
  • 設(shè)置任務(wù)觸發(fā)器,觸發(fā)任務(wù)執(zhí)行,其中就可以修改任務(wù)的執(zhí)行周期。

Class : SpringDynamicCornTask

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package com.xindatai.ibs.lime.dycSchedul;
import java.util.Date;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Lazy;
import org.springframework.scheduling.Trigger;
import org.springframework.scheduling.TriggerContext;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.stereotype.Component;
 
/**
 * Spring動態(tài)周期定時(shí)任務(wù) 在不停應(yīng)用的情況下更改任務(wù)執(zhí)行周期
 *
 * @author Liang
 *
 *         2017年6月1日
 */
@Lazy(false)
@Component
@EnableScheduling
public class SpringDynamicCornTask implements SchedulingConfigurer {
    private static final Logger logger = LoggerFactory.getLogger(SpringDynamicCornTask.class);
    private static String cron;
    private SpringDynamicCornTask() {
        cron = "0/5 * * * * ?";
        // 開啟新線程模擬外部更改了任務(wù)執(zhí)行周期
        new Thread(new Runnable() {
 
            @Override
            public void run() {
                try {
                    Thread.sleep(15 * 1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                cron = "0/10 * * * * ?";
                System.out.println("cron change to : " + cron);
            }
        }).start();
    }
 
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.addTriggerTask(new Runnable() {
 
            @Override
            public void run() {
                // 任務(wù)邏輯
                logger.info("dynamicCronTask is running...");
            }
        }, new Trigger() {
 
            @Override
            public Date nextExecutionTime(TriggerContext triggerContext) {
                // 任務(wù)觸發(fā),可修改任務(wù)的執(zhí)行周期
                CronTrigger trigger = new CronTrigger(cron);
                Date nextExecutionTime = trigger.nextExecutionTime(triggerContext);
                return nextExecutionTime;
            }
        });
    }
}

Console :

[INFO 2017-06-01 12:26:25 SpringDynamicCornTask] - dynamicCronTask is running...
[INFO 2017-06-01 12:26:30 SpringDynamicCornTask] - dynamicCronTask is running...
[INFO 2017-06-01 12:26:35 SpringDynamicCornTask] - dynamicCronTask is running...
cron change to : 0/10 * * * * ?
[INFO 2017-06-01 12:26:40 SpringDynamicCornTask] - dynamicCronTask is running...
[INFO 2017-06-01 12:26:50 SpringDynamicCornTask] - dynamicCronTask is running...
[INFO 2017-06-01 12:27:00 SpringDynamicCornTask] - dynamicCronTask is running...

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持服務(wù)器之家。

原文鏈接:https://blog.csdn.net/JJ_LIJIN/article/details/78644985

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 毛片视频播放 | 中文字幕涩涩久久乱小说 | 欧美18一12sex性处hd | 久久久青| 毛片免费在线观看视频 | 欧美综合在线观看视频 | 鲁久久| 牛牛热这里只有精品 | 摸逼逼视频 | 一级免费特黄视频 | 黄色网址电影 | av在线播放免费观看 | 久久国产中文 | 日本免费一区二区三区四区 | 久久狂草| 欧美一级不卡视频 | 欧美精品a∨在线观看不卡 午夜精品影院 | 亚洲午夜不卡 | 91国内精品久久久久免费影院 | 国产精品久久久久国产精品三级 | 欧美巨根 | 国产精品久久久乱弄 | 亚洲少妇诱惑 | 国产精品久久久久久久娇妻 | aa级黄色片 | 成人国产精品久久久 | 久久久久国产成人精品亚洲午夜 | 精国品产一区二区三区有限公司 | 青草视频在线观看视频 | 污黄视频在线播放 | 国产羞羞视频 | 久久久久久久久久亚洲 | 国产成人高清成人av片在线看 | 黄视频免费在线 | 国产99页 | 大胆在线日本aⅴ免费视频 永久免费毛片 | 亚洲精品久久久久久下一站 | 精品久久久久久久久久久久久久久久久久久 | 91网站免费观看 | 国产精品久久久久影院老司 | 在线中文资源免费 |