SpringBoot动态定时任务

标签: 无 分类: 未分类 创建时间:2022-05-12 07:15:56 更新时间:2024-12-03 13:01:37

除了使用配置的方式进行定时任务的创建,还有一种需求就是动态的定时任务,比如,当前时间之后的某一个时间执行一次代码。

参考文章:
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;

/**
* @author crush
*/
@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;
}

/**
* 添加一个动态任务
*
* @param task
* @return
*/
public boolean add(RechargeTask task) {
// 此处的逻辑是 ,如果当前已经有这个名字的任务存在,先删除之前的,再添加现在的。(即重复就覆盖)
if (null != oneTaskMap.get(task.getName())) {
stop(task.getName());
}

// hutool 工具包下的一个转换类型工具类 好用的很
ConverterRegistry converterRegistry = ConverterRegistry.getInstance();
String start=task.getStart();
Date startTime=new Date();
if(start!=null){
startTime = converterRegistry.convert(Date.class, task.getStart());
}

// schedule :调度给定的Runnable ,在指定的执行时间调用它。
//一旦调度程序关闭或返回的ScheduledFuture被取消,执行将结束。
//参数:
//任务 – 触发器触发时执行的 Runnable
//startTime – 任务所需的执行时间(如果这是过去,则任务将立即执行,即尽快执行)
ScheduledFuture<?> schedule = syncScheduler.schedule(getRunnable(task), startTime);
oneTaskMap.put(task.getName(), schedule);
return true;
}


/**
* 运行任务
*
* @param task
* @return
*/
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--------");
};
}

/**
* 停止任务
*
* @param name
* @return
*/
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;
}
文章目录
小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。