Java 基于石英调度器的spring boot动态作业调度
我希望根据用户从UI提供的调度配置动态调度作业。当用户从UI保存新的计划配置时,流程必须使用新的计划参数调用新作业。可以有n个这样的配置来执行相同的作业。Spring支持作业细节和触发器的实现,如下所示 定义作业详细信息:Java 基于石英调度器的spring boot动态作业调度,java,spring,spring-boot,quartz-scheduler,Java,Spring,Spring Boot,Quartz Scheduler,我希望根据用户从UI提供的调度配置动态调度作业。当用户从UI保存新的计划配置时,流程必须使用新的计划参数调用新作业。可以有n个这样的配置来执行相同的作业。Spring支持作业细节和触发器的实现,如下所示 定义作业详细信息: @Bean public JobDetail jobDetail() { return JobBuilder.newJob().ofType(SampleJob.class) .storeDurably() .withIdentity("Qrt
@Bean
public JobDetail jobDetail() {
return JobBuilder.newJob().ofType(SampleJob.class)
.storeDurably()
.withIdentity("Qrtz_Job_Detail")
.withDescription("Invoke Sample Job service...")
.build();
}
@Bean
public Trigger trigger(JobDetail job) {
return TriggerBuilder.newTrigger().forJob(job)
.withIdentity("Qrtz_Trigger")
.withDescription("Sample trigger")
.withSchedule(simpleSchedule().repeatForever().withIntervalInHours(1))
.build();
}
定义触发器:
@Bean
public JobDetail jobDetail() {
return JobBuilder.newJob().ofType(SampleJob.class)
.storeDurably()
.withIdentity("Qrtz_Job_Detail")
.withDescription("Invoke Sample Job service...")
.build();
}
@Bean
public Trigger trigger(JobDetail job) {
return TriggerBuilder.newTrigger().forJob(job)
.withIdentity("Qrtz_Trigger")
.withDescription("Sample trigger")
.withSchedule(simpleSchedule().repeatForever().withIntervalInHours(1))
.build();
}
如何传递作业详细信息的参数,并根据用户提供的参数动态触发 最简单的方法是通过扩展和
@Override
createJobInstance方法进行一些配置。然后,您需要定义并最终确定您的:
然后,在应用程序中的任何位置,例如在RestController中,您都可以访问调度程序并安排新作业:
@RestController
public class ScheduleController {
@Autowired
private Scheduler scheduler;
@GetMapping(value = "/schedule/{detail}/{desc}")
public String scheduleJob(@PathVariable(value = "detail") String detail, @PathVariable(value = "desc") String desc) throws SchedulerException {
JobDetail job = newJob(detail, desc);
return scheduler.scheduleJob(job, trigger(job)).toString();
}
private JobDetail newJob(String identity, String description) {
return JobBuilder.newJob().ofType(SimpleJob.class).storeDurably()
.withIdentity(JobKey.jobKey(identity))
.withDescription(description)
.build();
}
private SimpleTrigger trigger(JobDetail jobDetail) {
return TriggerBuilder.newTrigger().forJob(jobDetail)
.withIdentity(jobDetail.getKey().getName(), jobDetail.getKey().getGroup())
.withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(1))
.build();
}
}
您可以从
计划程序中控制所有计划(暂停、停止、重新启动、删除等)
-这就是JobDataMap参数的用途。可以使用这些参数向作业和触发器传递任意参数。通常建议使用字符串参数值以避免各种序列化问题。JobDataMap API提供了辅助方法,可用于将字符串值的JobDataMap参数值转换为各种基本Java对象(整数、长、双精度、布尔值等)
请注意,在JobDetail级别上指定的JobDataMap参数可以在触发器级别上重写。在JobDetail级别上,通常指定应用于所有作业执行的公共参数和/或默认值,并在触发器级别覆盖这些默认值和/或添加新参数
有关详细信息,请参阅Quartz Javadoc:
我创建了一篇博客文章来解决这个问题。你可以看看