![](/img/trans.png)
[英]How can i change the scheduling of jobs dynamically using Spring/Quartz?
[英]How can I dynamically create Triggers in Spring Boot using Quartz?
我有这样的代码:
@Component
public class SampleJob implements Job {
@Autowired
private SampleTask sampleTask;
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
sampleTask.imprimir();
}
@Bean
public JobDetail jobDetail(){
return JobBuilder.newJob().ofType(SampleJob.class)
.storeDurably()
.withIdentity("Quartz_Job_Detail")
.withDescription("Estoy invocando el job de ejempo")
.build();
}
@Bean
public Trigger trigger(JobDetail jobDetail){
return TriggerBuilder.newTrigger().forJob(jobDetail)
.withIdentity("Quartz_Trigger")
.withDescription("Trigger de ejemplo")
.withSchedule(SimpleScheduleBuilder.simpleSchedule().repeatForever().withIntervalInMilliseconds(5000))
.build();
}
}
在这种情况下,imprimir()是仅打印文本以知道石英正在工作的函数。 上面的代码创建了一个每5秒运行一次的触发器。 现在,我要做的是基于从数据库中获取的列表元素创建多个触发器。 每个触发器必须具有不同的计划时间。 如何使用循环或其他方法创建具有不同触发时间的多个触发器?
您只需要创建一次持久性作业,然后为该作业创建所有触发器。
@Service
class QuartzService {
@Autowired
private SchedulerFactoryBean schedulerFactoryBean;
void init(List<MyTrigger> triggers) {
Scheduler scheduler = schedulerFactoryBean.getScheduler();
scheduler.addJob(job(), true);
for (MyTrigger myTrigger: triggers) {
scheduler.scheduleJob(trigger(myTrigger));
}
}
private JobDetail job() {
return JobBuilder.newJob(SampleJob.class)
.withIdentity("QuartzJob", "QuartzJob")
.storeDurably()
.build();
}
private Trigger trigger(MyTrigger trigger) {
return TriggerBuilder.newTrigger()
.withIdentity(trigger.name)
.withSchedule(
CronScheduleBuilder.cronSchedule(trigger.schedule))
.forJob("QuartzJob", "QuartzJob")
.build();
}
}
class MyTrigger {
String name;
String schedule;
}
因此,这里您只需要将MyTrigger的列表传递给QuartsService.init()方法,它将使用自己的时间表动态创建触发器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.