具体实现代码如下:
/**
* 加载定时任务
* @author
*/
@EnableScheduling
@Configuration
@Component
@Slf4j
public class TimedTaskServiceImpl implements SchedulingConfigurer {
//获取运行机器名称
private static final String QUEUE_NAME = new LocalInfoUtil().getHostName();
@Bean
public Queue queue(){
return new Queue(QUEUE_NAME,true);
}
private static ScheduledTaskRegistrar taskRegistrar;
@Autowired
OnlineReminderTemplateService onlineReminderTemplateService;
@Bean
public ScheduledExecutorService concurrentTaskScheduler(){
ScheduledThreadPoolExecutor executorService = new ScheduledThreadPoolExecutor(3);
executorService.setMaximumPoolSize(10);
executorService.setRejectedExecutionHandler(new ScheduledThreadPoolExecutor.CallerRunsPolicy());
return executorService;
}
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.setScheduler(concurrentTaskScheduler());
TimedTaskServiceImpl.taskRegistrar = taskRegistrar;
addTriggerTask(true);
}
/**
* 添加任务 通过rabbitMQ 获取广播模式下的添加定时任务(处理集群下动态添加定时任务)
* @param rest
*/
@RabbitListener(queues = "#{queue.name}")
public void addTriggerTask(boolean rest) {
if(rest){
//取消定时任务
//remove();
taskRegistrar.destroy();
//获取数据库中的定时任务列表
List<OnlineReminderTimeVo> onlineReminderTimeVos = onlineReminderTemplateService.getOnlineReminderTimeList();
onlineReminderTimeVos.forEach(onlineReminderTime ->{
String taskId = setTaskId(onlineReminderTime);
//增加任务
taskRegistrar.addCronTask(new Task(taskId),onlineReminderTime.getCron());
taskRegistrar.afterPropertiesSet();
});
}
}
/**
* 取消任务
* @param
* @return
*/
public void remove(){
taskRegistrar.getScheduledTasks().forEach(T->{
if(T.getTask().getRunnable().getClass().equals(Task.class)){
Task task = (Task) T.getTask().getRunnable();
log.info("任务【{}】已在执行计划中!取消该任务!", task.task);
T.cancel();
}
});
}
/**
* 查询所有定时任务
*/
public void getScheduledTasks(){
taskRegistrar.getScheduledTasks().forEach(T->{
Task task = (Task) T.getTask().getRunnable();
log.info("getScheduledTasks = " + task.task);
});
}
/**
* 设置定时任务taskId
* @param onlineReminderTime
* @return
*/
public String setTaskId(OnlineReminderTimeVo onlineReminderTime){
String taskId = onlineReminderTime.getReminderId() + "," + onlineReminderTime.getId() + "," + onlineReminderTime.getBusinessNature() + "," + onlineReminderTime.getInAdvanceDays()
+ ","+onlineReminderTime.getReceiver();
return taskId;
}
}