成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

探索動態(tài)執(zhí)行的計劃任務-DynamicSchedule

開發(fā) 前端
通過上述方法,我們可以在 Spring Boot 應用中實現(xiàn)動態(tài)計劃任務,使得任務的執(zhí)行更加靈活可控。還實驗了幾種不同的方式,比如每秒輪詢數(shù)據(jù)庫、手動計算cron表達式 的執(zhí)行時間。感覺就屬這個事件驅(qū)動的方式最優(yōu)雅。

背景

在現(xiàn)代軟件開發(fā)中,計劃任務是一種常見的需求。無論是定時發(fā)送郵件、定期清理緩存,還是執(zhí)行數(shù)據(jù)同步,計劃任務都能幫助我們自動化這些重復性工作。

最近有一個需求,用戶想要自己設定定時時間,來動態(tài)的執(zhí)行定時任務。 很離譜,原來每天晚上12點定時執(zhí)行的幾個數(shù)據(jù)同步、數(shù)據(jù)清理任務,想不通用戶要這個功能干啥!!!

探索歷程

原本的cron表達式,是直接寫死到代碼里的,顯然不能動態(tài)的修改。

如果采用配置文件的方式,每次改動要重啟項目,或者再寫個定時任務,每秒讀取文件內(nèi)容,也不太合適。

如果引入分布式任務調(diào)度平臺,比如xxl-job、power-job、snail-job,又覺得太復雜。

選擇采用放到數(shù)據(jù)庫的方式,實現(xiàn)過程中,發(fā)現(xiàn)并不是很順利,寫一篇文章記錄一下這次的過程。

原本的實現(xiàn)

@Scheduled(cron = "0/5 * * * * *")  
public void demo() {  
    System.out.println(LocalDateTime.now());  
}

結(jié)果

圖片圖片

動態(tài)設置

配置類

@Component  
@RequiredArgsConstructor  
public class JobConfig implements SchedulingConfigurer {  
  
    private final ITestJobService jobService;  
  
    @Override  
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {  
        taskRegistrar.addTriggerTask(  
                //1.添加任務內(nèi)容(Runnable)  
                () -> System.out.println("執(zhí)行動態(tài)定時任務1: " + LocalDateTime.now()),  
                //2.設置執(zhí)行周期(Trigger)  
                triggerContext -> {  
                    TestJob job = jobService.getById(1L);  
                    return new CronTrigger(job.getCron()).nextExecutionTime(triggerContext).toInstant();  
                }  
        );  
    }  
}

修改入口

@GetMapping("upd")  
public String upd(@RequestParam("cron") String cron) {  
    jobService.updateById(new TestJob(1, cron));  
    System.out.println("修改時間:"+ LocalDateTime.now());  
    return "success";  
}

將 0/10 * * * * * 改為 0/5 * * * * *

結(jié)果

圖片圖片

可以看出來 修改的時間是 15:01 ,但是下次執(zhí)行時間還是間隔了10秒,第二次之后的時間才是間隔5秒。 更新結(jié)果有一個周期的延遲。

在這種情況下,延遲還算可以接收,但是周期如果是一天、一周,那生效周期就太長了,需要一種即時生效的方法。

即時生效

實現(xiàn)方案是,以事件驅(qū)動,動態(tài)修改定時任務。

定義事件

@Getter  
public class ScheduleTaskUpdateEvent extends ApplicationEvent {  
  
    private final Integer taskId;  
  
    public ScheduleTaskUpdateEvent(Object source, Integer taskId) {  
        super(source);  
        this.taskId = taskId;  
    }  
}

構(gòu)造調(diào)度任務程序

@Configuration  
public class SchedulerConfig {  
  
    @Bean  
    public ThreadPoolTaskScheduler taskScheduler() {  
        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();  
        scheduler.setPoolSize(10); // 設置線程池大小  
        scheduler.setThreadNamePrefix("scheduled-task-");  
        scheduler.initialize();  
        return scheduler;  
    }  
}

動態(tài)任務配置

@Component  
public class DynamicScheduleTaskConfig implements ApplicationListener<ScheduleTaskUpdateEvent> {  
  
    @Resource  
    private ITestJobService jobService;  
  
    @Resource  
    private TaskScheduler taskScheduler;  
  
    private final Map<Integer, ScheduledFuture<?>> scheduledTasks = new ConcurrentHashMap<>();  
  
    @PostConstruct  
    private void initializeTasks() {  
        List<TestJob> list = jobService.list();  
        list.forEach(job -> {  
            ScheduledFuture<?> future = scheduleTask(job);  
            scheduledTasks.put(job.getId(), future);  
        });  
    }  
  
    // 根據(jù)任務配置創(chuàng)建任務  
    private ScheduledFuture<?> scheduleTask(TestJob job) {  
        System.out.println("創(chuàng)建新的定時任務,id:" + job.getId() + ", cron: " + job.getCron());  
        return taskScheduler.schedule(  
                () -> System.out.println("執(zhí)行動態(tài)定時任務2: " + LocalDateTime.now()),  
                triggerContext -> {  
                    return new CronTrigger(job.getCron()).nextExecutionTime(triggerContext).toInstant();  
                }  
        );  
    }  
  
    @Override  
    public void onApplicationEvent(ScheduleTaskUpdateEvent event) {  
        System.out.println("收到修改定時任務事件,任務id:" + event.getTaskId());  
        // 取消并移除舊任務  
        ScheduledFuture<?> future = scheduledTasks.get(event.getTaskId());  
        if (future != null) {  
            future.cancel(false);  
            scheduledTasks.remove(event.getTaskId());  
        }  
  
        // 獲取最新的任務配置并重新注冊該任務  
        TestJob job = jobService.getById(event.getTaskId());  
        ScheduledFuture<?> newFuture = scheduleTask(job);  
        scheduledTasks.put(job.getId(), newFuture);  
    }  
}

修改接口,增加事件

@GetMapping("upd")  
public String upd(@RequestParam("cron") String cron) {  
    jobService.updateById(new TestJob(1, cron));  
    eventPublisher.publishEvent(new ScheduleTaskUpdateEvent(this, 1));  
    System.out.println("修改時間:"+ LocalDateTime.now());  
    return "success";  
}

結(jié)果

圖片圖片

可以看到,在收到修改任務的事件后,直接刪除了原來的定時任務,創(chuàng)建了一個新的執(zhí)行任務,即時生效,不需要等待一個執(zhí)行周期就可立即執(zhí)行。

小結(jié)

通過上述方法,我們可以在 Spring Boot 應用中實現(xiàn)動態(tài)計劃任務,使得任務的執(zhí)行更加靈活可控。

還實驗了幾種不同的方式,比如每秒輪詢數(shù)據(jù)庫、手動計算cron表達式 的執(zhí)行時間。感覺就屬這個事件驅(qū)動的方式最優(yōu)雅。

責任編輯:武曉燕 來源: Java技術(shù)指北
相關(guān)推薦

2010-01-07 11:19:45

Linux計劃任務

2010-03-09 17:45:11

Linux計劃任務

2017-03-27 08:30:00

Windows 8Windows計劃任務

2010-01-20 10:27:16

Linuxcrond命

2021-01-08 08:47:56

Saltstack架構(gòu)管理服務器

2023-10-06 12:15:02

2017-07-14 11:50:15

Windows 10Windows計劃任務

2017-11-23 09:00:02

Linuxcron計劃任務

2011-04-01 09:17:01

備份cactiwindows

2017-06-09 13:17:04

Linuxcronanacron

2019-05-29 08:00:00

Linux計劃任務cron

2010-05-04 12:29:15

Oracle數(shù)據(jù)庫

2021-01-14 16:14:06

Python爬蟲代碼

2023-06-29 07:55:52

Quartz.Net開源

2010-05-04 12:43:11

Oracle數(shù)據(jù)庫

2025-01-16 08:07:05

cron可視化管理器開源

2010-11-15 09:10:43

CrontabLinux計劃任務

2024-11-11 10:58:03

Spring接口編程

2021-03-16 21:30:27

Windows 10Windows操作系統(tǒng)

2010-01-07 11:10:00

cron配置計劃
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 日本三级在线 | 欧美a∨ | 国产日韩精品在线 | 日韩一区二区三区av | 国产精品视频导航 | 草比av| 亚洲日韩第一页 | 亚洲视频在线免费观看 | 亚洲精品久久久久中文字幕欢迎你 | 中文字幕日韩欧美一区二区三区 | 国产精品高潮呻吟久久 | 中午字幕在线观看 | www.色53色.com| 亚洲一区二区三区桃乃木香奈 | 国产一区二区三区 | 日韩精品一二三 | 99热热99| 午夜视频在线观看网址 | 一区二区三区四区在线 | 亚洲欧洲激情 | 一区二区视频在线 | 久久精品成人 | 97色在线观看免费视频 | 伊人婷婷 | 久草电影网 | 一区二区三区电影在线观看 | 欧美中文字幕一区二区 | 久久久久久国模大尺度人体 | www九色 | 国产精品日本一区二区在线播放 | 欧美日韩综合精品 | 国产一区二区三区精品久久久 | 色网站视频 | 亚洲激情在线 | 日韩a v在线免费观看 | 国产精品久久久久久久久久久免费看 | 在线免费av观看 | 欧美性受xxx| 欧美一区二区三区在线观看视频 | 欧美日韩国产一区二区三区 | 成人在线h |