gpt4 book ai didi

java - 使用 quartz 调度程序在 Spring Boot 中进行动态作业调度

转载 作者:行者123 更新时间:2023-12-01 14:14:19 25 4
gpt4 key购买 nike

我想根据用户从 UI 提供的调度配置动态调度作业。当用户从 UI 保存新的计划配置时,流程必须使用新的计划参数调用新作业。可以有 n 个配置来执行相同的作业。 Spring 支持 job detail 和 trigger 的实现如下。

定义作业详细信息:

@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();
}

如何根据用户提供的参数动态传递job明细参数和触发?

最佳答案

最简单的方法是通过扩展 SpringBeanJobFactory 进行一些配置和 @Override createJobInstance 方法。那么你需要定义SchedulerFactoryBean最后是您的 Scheduler :

@Configuration
public class SchedulerConfiguration {

public class AutowireCapableBeanJobFactory extends SpringBeanJobFactory {

private final AutowireCapableBeanFactory beanFactory;

@Autowired
public AutowireCapableBeanJobFactory(AutowireCapableBeanFactory beanFactory) {
Assert.notNull(beanFactory, "Bean factory must not be null");
this.beanFactory = beanFactory;
}

@Override
protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
Object jobInstance = super.createJobInstance(bundle);
this.beanFactory.autowireBean(jobInstance);
this.beanFactory.initializeBean(jobInstance, null);
return jobInstance;
}
}

@Bean
public SchedulerFactoryBean schedulerFactory(ApplicationContext applicationContext) {
SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
schedulerFactoryBean.setJobFactory(new AutowireCapableBeanJobFactory(applicationContext.getAutowireCapableBeanFactory()));
return schedulerFactoryBean;
}

@Bean
public Scheduler scheduler(ApplicationContext applicationContext) throws SchedulerException {
Scheduler scheduler = schedulerFactory(applicationContext).getScheduler();
scheduler.start();
return scheduler;
}
}

然后在您的应用程序中的任何地方,例如在 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();
}
}

您可以从 Scheduler 控制所有计划(暂停、停止、重新启动、删除等...) - look at the documentation

关于java - 使用 quartz 调度程序在 Spring Boot 中进行动态作业调度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55344238/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com