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服务重新触发调度程序