Java 动态多cron表达式的Spring引导计划

Java 动态多cron表达式的Spring引导计划,java,spring,spring-boot,spring-scheduled,Java,Spring,Spring Boot,Spring Scheduled,朋友们,我有一个要求,客户可以每周安排一个作业,他可以随时更改此值,而无需重新启动应用程序。应该有新的更改适用。应用程序将被许多客户端使用,因此将有多个动态调度程序,每个动态调度程序将根据其配置运行。 范例- Customer1 schedules Job on Monday 1:00PM Customer2 schedules Job on Wednesday 3:00AM 我需要编写Sprint引导调度器,它可以动态地从数据库中获取这些值。假设这已开始正常运行,Customer1将作业计

朋友们,我有一个要求,客户可以每周安排一个作业,他可以随时更改此值,而无需重新启动应用程序。应该有新的更改适用。应用程序将被许多客户端使用,因此将有多个动态调度程序,每个动态调度程序将根据其配置运行。 范例-

Customer1 schedules Job on Monday 1:00PM 
Customer2 schedules Job on Wednesday 3:00AM
我需要编写Sprint引导调度器,它可以动态地从数据库中获取这些值。假设这已开始正常运行,Customer1将作业计时更改为

Customer1 reschedules Job on Friday 1:00PM
然后,应用程序应具有适用的更改。我能够从数据库中获取价值,并能够动态运行它。但是,当客户更改值时,如何在不重新启动应用程序的情况下重新触发作业。我已经通过了几个链接,但希望有一个可行的解决方案,因为我不明白它

我所做的

@SpringBootApplication
@EnableScheduling
@EnableAsync
@EnableConfigurationProperties
public class PricingApplication extends SpringBootServletInitializer implements SchedulingConfigurer, DisposableBean {


    ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();

    public static void main(String[] args) {
        SpringApplication.run(PricingApplication.class, args);
    }
        
    
    public Map<Long, String> myCustomScheduler(){
     // Hard coded below values but actually it will populate from DB and cron expression will get as below
        Map<Long, String> cronSchedule = new HashMap<>();
        cronSchedule.put(1L, "*/25 * * * * *");
        cronSchedule.put(2L, "*/5 * * * * *");
        return cronSchedule;
    }


    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar){
        Map<Long, String> cronValues =  myCustomScheduler();

        cronValues.forEach((customer, cronValue) ->{
            Runnable runTask = () -> System.out.println("This is the task scheduled for customer - "+customer+ "  Ans cron Expression is "+cronValue);
            Trigger trigger = new Trigger() {
                @Override
                public Date nextExecutionTime(TriggerContext triggerContext) {
                    Map<Long, String> newCronValues = myCustomScheduler();
                    String newCron = newCronValues.get(customer);
                    if(!newCron.equalsIgnoreCase(cronValue)){
                        taskRegistrar.setTriggerTasksList(new ArrayList<TriggerTask>());
                        configureTasks(taskRegistrar);
                        taskRegistrar.destroy();
                        taskRegistrar.setScheduler(scheduledExecutorService);
                        taskRegistrar.afterPropertiesSet();
                        return  null;
                    }
                    CronTrigger cronTrigger = new CronTrigger(cronValue);
                    return cronTrigger.nextExecutionTime(triggerContext);
                }
            };
            taskRegistrar.addTriggerTask(runTask, trigger);
        });
    }

   

    @Override
    public void destroy() throws Exception {
        if (scheduledExecutorService != null) {
            scheduledExecutorService.shutdownNow();
        }
    }
}
@springboot应用程序
@使能调度
@使能同步
@EnableConfigurationProperties
公共类PricingApplication扩展了SpringBootServletInitializer实现了SchedulingConfigurer,DisposableBean{
ScheduledExecutorService ScheduledExecutorService=执行者。newSingleThreadScheduledExecutor();
公共静态void main(字符串[]args){
run(pricingaapplication.class,args);
}
公共映射myCustomScheduler(){
//下面的值是硬编码的,但实际上它将从DB填充,cron表达式将如下所示
Map cronSchedule=newhashmap();
(1升,“*/25****”);
将(2L,“*/5****”)置于附表中;
返回时间表;
}
@凌驾
公共无效配置任务(ScheduledTaskRegistrar任务注册器){
Map cronValues=myCustomScheduler();
forEach((客户,cronValue)->{
Runnable runTask=()->System.out.println(“这是为客户-“+customer+”安排的任务,而cron表达式是“+cronValue”);
触发器=新触发器(){
@凌驾
公共日期下一个执行时间(TriggerContext TriggerContext){
Map newCronValues=myCustomScheduler();
字符串newCron=newCronValues.get(客户);
如果(!newCron.equalsIgnoreCase(cronValue)){
setTriggerTasksList(新的ArrayList());
配置任务(任务注册器);
taskRegister.destroy();
TaskRegister.setScheduler(scheduledExecutorService);
taskRegistrar.AfterPropertieSet();
返回null;
}
CronTrigger CronTrigger=新的CronTrigger(cronValue);
返回cronTrigger.nextExecutionTime(triggerContext);
}
};
taskRegistrar.addTriggerTask(runTask,触发器);
});
}
@凌驾
public void destroy()引发异常{
if(scheduledExecutorService!=null){
scheduledExecutorService.shutdownNow();
}
}
}

处理上述情况的任何建议或最佳方法。感谢您的回复

我在这里寻求帮助我在这里寻找解决方案,如何通过Rest服务重新触发调度程序