Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 基于石英调度器的spring boot动态作业调度_Java_Spring_Spring Boot_Quartz Scheduler - Fatal编程技术网

Java 基于石英调度器的spring boot动态作业调度

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

我希望根据用户从UI提供的调度配置动态调度作业。当用户从UI保存新的计划配置时,流程必须使用新的计划参数调用新作业。可以有n个这样的配置来执行相同的作业。Spring支持作业细节和触发器的实现,如下所示

定义作业详细信息:

@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:


我创建了一篇博客文章来解决这个问题。你可以看看