为了解决这个问题,我创建了一个SchedulerOrchestrator来管理我的工作。作业包含SchedulerFuture。
我希望这里的代码可以对其他人有所帮助。
让我们从将由我的工作实现的接口开始:
public interface SchedulerObjectInterface { void start(); void stop();}每个作业都需要一个ScheduledFuture才能停止,并且需要自动连接一个TaskScheduler进行计划。这里是一份工作的示例(您可以创建任意数量的工作):
@Componentpublic class MyFirstJob implements SchedulerObjectInterface { private static final Logger log = LoggerFactory.getLogger(MyFirstJob.class); public static final String JOB = "MyFirstJob"; @Autowired JobRepository jobRepository; private ScheduledFuture future; @Autowired private TaskScheduler scheduler; @Override public void start() { future = scheduler.schedule(new Runnable() { @Override public void run() { System.out.println(JOB + " Hello World! " + new Date()); } }, new Trigger() { @Override public Date nextExecutionTime(TriggerContext triggerContext) { String cron = cronConfig(); System.out.println(cron); CronTrigger trigger = new CronTrigger(cron); return trigger.nextExecutionTime(triggerContext); } }); } @Override public void stop() { future.cancel(false); } // retrieve cron from database private String cronConfig() { JobScheduled byJobNameIgnoreCase = jobRepository.findByJobNameIgnoreCase(JOB); return byJobNameIgnoreCase.getCrontab(); }}最后,我们可以将工作添加到协调器中:
@Configurationpublic class SchedulerOrchestrator { private static final Logger log = LoggerFactory.getLogger(SchedulerOrchestrator.class); private static Map<String, SchedulerObjectInterface> schduledJobsMap = new HashMap<>(); @Autowired JobRepository jobRepository; @Autowired MyFirstJob myFirstJob; @Autowired MySecondJob mySecondJob; @Autowired TaskScheduler scheduler; @PostConstruct public void initScheduler() { schduledJobsMap.put(MyFirstJob.JOB, myFirstJob); schduledJobsMap.put(MySecondJob.JOB, mySecondJob); startAll(); } public void restart(String job) { stop(job); start(job); } public void stop(String job) { schduledJobsMap.get(job).stop(); } public void start(String job) { schduledJobsMap.get(job).start(); } public void startAll() { for (SchedulerObjectInterface schedulerObjectInterface : schduledJobsMap.values()) { schedulerObjectInterface.start(); } } @Bean public TaskScheduler scheduler() { return new ThreadPoolTaskScheduler(); }}


