繁体   English   中英

如何使用Quartz在Spring Boot中动态创建触发器?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM