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

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

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

背景

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

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

探索歷程

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

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

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

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

原本的實現(xiàn)

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

結(jié)果

圖片圖片

動態(tài)設(shè)置

配置類

@Component  
@RequiredArgsConstructor  
public class JobConfig implements SchedulingConfigurer {  
  
    private final ITestJobService jobService;  
  
    @Override  
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {  
        taskRegistrar.addTriggerTask(  
                //1.添加任務(wù)內(nèi)容(Runnable)  
                () -> System.out.println("執(zhí)行動態(tài)定時任務(wù)1: " + LocalDateTime.now()),  
                //2.設(shè)置執(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)修改定時任務(wù)。

定義事件

@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)度任務(wù)程序

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

動態(tài)任務(wù)配置

@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ù)任務(wù)配置創(chuàng)建任務(wù)  
    private ScheduledFuture<?> scheduleTask(TestJob job) {  
        System.out.println("創(chuàng)建新的定時任務(wù),id:" + job.getId() + ", cron: " + job.getCron());  
        return taskScheduler.schedule(  
                () -> System.out.println("執(zhí)行動態(tài)定時任務(wù)2: " + LocalDateTime.now()),  
                triggerContext -> {  
                    return new CronTrigger(job.getCron()).nextExecutionTime(triggerContext).toInstant();  
                }  
        );  
    }  
  
    @Override  
    public void onApplicationEvent(ScheduleTaskUpdateEvent event) {  
        System.out.println("收到修改定時任務(wù)事件,任務(wù)id:" + event.getTaskId());  
        // 取消并移除舊任務(wù)  
        ScheduledFuture<?> future = scheduledTasks.get(event.getTaskId());  
        if (future != null) {  
            future.cancel(false);  
            scheduledTasks.remove(event.getTaskId());  
        }  
  
        // 獲取最新的任務(wù)配置并重新注冊該任務(wù)  
        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é)果

圖片圖片

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

小結(jié)

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

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

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

2010-01-07 11:19:45

Linux計劃任務(wù)

2010-03-09 17:45:11

Linux計劃任務(wù)

2017-03-27 08:30:00

Windows 8Windows計劃任務(wù)

2010-01-20 10:27:16

Linuxcrond命

2021-01-08 08:47:56

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

2023-10-06 12:15:02

2017-07-14 11:50:15

Windows 10Windows計劃任務(wù)

2017-11-23 09:00:02

Linuxcron計劃任務(wù)

2011-04-01 09:17:01

備份cactiwindows

2017-06-09 13:17:04

Linuxcronanacron

2019-05-29 08:00:00

Linux計劃任務(wù)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計劃任務(wù)

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ù)棧公眾號

主站蜘蛛池模板: 中文字幕日韩专区 | 中文字幕日韩专区 | 国内精品久久久久久影视8 最新黄色在线观看 | 在线观看欧美日韩视频 | 麻豆91av | 久久一久久 | 日韩精品免费一区 | 精品免费 | 96av麻豆蜜桃一区二区 | 久久亚洲欧美日韩精品专区 | 福利av在线 | 91精品久久久久久久久久入口 | 久热精品免费 | 久久成人精品 | 国产成人av电影 | 日韩精品在线看 | 久久亚洲天堂 | 成人精品在线观看 | 91婷婷韩国欧美一区二区 | 国产精品一区二区在线播放 | 91亚洲国产成人久久精品网站 | 91av久久久| 成人一区二区三区 | 久久精品久久久 | 成人在线中文字幕 | 久久成人精品视频 | 亚洲精品乱码久久久久久黑人 | 精品少妇一区二区三区在线播放 | 日本久久黄色 | 91免费电影 | 亚洲精品一区国产精品 | 久久久国产一区二区三区四区小说 | 精品九九 | 久久一起草 | 青青伊人久久 | 欧美日韩18 | 欧美一区永久视频免费观看 | 日韩欧美在线免费观看 | 日韩在线 | 国产精品久久国产精品久久 | 久久精品一区二区三区四区 |