除了使用配置的方式进行定时任务的创建,还有一种需求就是动态的定时任务,比如,当前时间之后的某一个时间执行一次代码。
参考文章:
1.SpringBoot实现固定、动态定时任务 | 三种实现方式 注解的方式实现,通过读取数据周期实现,最后一种就是一次性事件,我暂时参考了这里的文件。
2.SpringBoot动态定时任务的实现
3.SpringBoot中并发定时任务的实现、动态定时任务的实现(看这一篇就够了)
4.SpringBoot动态定时任务开发指南 这里讲了一个 热更新定时任务的执行周期(动态更新cron表达式),还有使用线程池实现的动态任
5.SpringBoot 动态操作定时任务(启动、停止、变更执行周期) 这里关于Future的问题,可以参考。
xx-job
参考文章:
1.分布式定时任务框架选型,写得太好了! 常见的开源方案:elastic-job、xxl-job、quartz、saturn、opencron、antares。
2.Java定时任务框架对比
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 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
| import cn.hutool.core.convert.ConverterRegistry; import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; import org.springframework.scheduling.support.CronTrigger; import org.springframework.stereotype.Component;
import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ScheduledFuture;
@Component @Slf4j public class DynamicTaskService {
public Map<String, ScheduledFuture<?>> oneTaskMap = new ConcurrentHashMap<>(); public Map<String,ScheduledFuture> cronTaskMap=new ConcurrentHashMap<>();
private final ThreadPoolTaskScheduler syncScheduler;
public DynamicTaskService(ThreadPoolTaskScheduler syncScheduler) { this.syncScheduler = syncScheduler; }
public boolean add(RechargeTask task) { if (null != oneTaskMap.get(task.getName())) { stop(task.getName()); }
ConverterRegistry converterRegistry = ConverterRegistry.getInstance(); String start=task.getStart(); Date startTime=new Date(); if(start!=null){ startTime = converterRegistry.convert(Date.class, task.getStart()); }
ScheduledFuture<?> schedule = syncScheduler.schedule(getRunnable(task), startTime); oneTaskMap.put(task.getName(), schedule); return true; }
public Runnable getRunnable(RechargeTask task) { return () -> { log.info("---动态定时任务运行---"); try { String taskName=task.getName(); ScheduledFuture<?> cronFuture=cronTaskMap.get(taskName); if(cronFuture!=null){ cronFuture.cancel(true); } cronFuture = syncScheduler.schedule(task, new CronTrigger(task.getCron())); cronTaskMap.put(taskName,cronFuture);
} catch (Exception e) { e.printStackTrace(); log.error("getRunnable",e); } log.info("---end--------"); }; }
public boolean stop(String name) { if (null == oneTaskMap.get(name)) { return false; } ScheduledFuture<?> scheduledFuture = oneTaskMap.get(name); scheduledFuture.cancel(true); oneTaskMap.remove(name); scheduledFuture = cronTaskMap.get(name); scheduledFuture.cancel(true); cronTaskMap.remove(name); return true; }
|