基于spring SchedulingConfigurer 动态添加多线程定时任务

603 阅读1分钟

具体实现代码如下:

/**
 * 加载定时任务
 * @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;
  }

}