定时调度管理类:
@Component
public class ScheduledTaskManager {
Logger logger = LoggerFactory.getLogger(getClass());
private static Map<String, ScheduledFuture<?>> scheduleFutureMap = ScheduledProcessPool.INSTANCE.getPool();
@Autowired
private ThreadPoolTaskScheduler threadPoolTaskScheduler;
@Autowired
private FuturesOrderService futuresOrderService;
private ScheduledFuture<?> schedule;
@Bean
public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
return new ThreadPoolTaskScheduler();
}
/**
* 描述:新增任务调度
*
* @param key 定时任务key
* @param cron 时间表达式
*/
public void addScheduled(String key, String cron) {
//移除key的任务调度
removeScheduled(key);
//新增任务调度
schedule = threadPoolTaskScheduler.schedule(() -> {
//此处进行定时调度的业务操作
}, new CronTrigger(cron));
if (schedule != null) {
scheduleFutureMap.put(key, schedule);
}
}
/**
* 描述:移除任务调度
*
* @param key 定时任务key
*/
public void removeScheduled(String key) {
//先取消任务调度
ScheduledFuture<?> future = scheduleFutureMap.get(key);
if (future != null && !future.isDone()) {
future.cancel(true);
}
//并将任务调度从map中移除
if (scheduleFutureMap.containsKey(key)) {
Iterator<String> it = scheduleFutureMap.keySet().iterator();
while (it.hasNext()) {
if (it.next().equals(key)) {
it.remove();
break;
}
}
}
}
}
定时调度池:
public enum ScheduledProcessPool {
INSTANCE;
private Map<String, ScheduledFuture<?>> scheduledPool;
/**
* 调度池初始容量
*/
private int initialCapacity = 50;
private ScheduledProcessPool() {
scheduledPool = new ConcurrentHashMap<String, ScheduledFuture<?>>(initialCapacity);
}
/**
* Description: 获取任务调度池
*/
public Map<String, ScheduledFuture<?>> getPool() {
return scheduledPool;
}
}
在需要动态生成定时调度任务的代码中,注入定时调度管理类,并调用其addScheduled()方法,传入调度池的key与定时调度时间表达式cron即可