如何在每次运行springboot项目时触发quartz调度器?

w8f9ii69  于 2023-06-22  发布在  Spring
关注(0)|答案(1)|浏览(107)

我正在尝试将quartz scheduler添加到我的springboot应用程序中,以便每天晚上12点运行cron job。这是我的配置

@Bean
public JobDetailFactoryBean demoJob() {
    JobDetailFactoryBean jobDetailFactory = new JobDetailFactoryBean();
    jobDetailFactory.setJobClass(DemoJob.class);
    jobDetailFactory.setDurability(true);
    return jobDetailFactory;
}

@Bean
public CronTriggerFactoryBean demoTrigger(
        @Qualifier("demoJob") JobDetail jobDetail) {
    CronTriggerFactoryBean trigger = new CronTriggerFactoryBean();
    trigger.setJobDetail(jobDetail);
    trigger.setCronExpression("0 0 0 * * ?");
    trigger.setMisfireInstruction(CronTrigger.MISFIRE_INSTRUCTION_DO_NOTHING);
    return trigger;
}

@Bean
public SpringBeanJobFactory springBeanJobFactory() {
    AutoWiringSpringBeanJobFactory jobFactory = new AutoWiringSpringBeanJobFactory();
    jobFactory.setApplicationContext(applicationContext);
    return jobFactory;
}

现在,除了每晚运行此项目外,每次运行此项目时都需要触发此作业。我试着设置

trigger.setStartTime(new Date());
trigger.setStartDelay(1);

但它并不触发每次我运行这个项目。我可以设置这个配置或者必须在我的方法符号上使用@Postconstructor吗?

nbysray5

nbysray51#

您可以在Sping Boot 中实现事件侦听器。对于您的目的,您可以坚持使用ApplicationReadyEvent,正如其名称所示,它在应用程序准备就绪时被触发。
例如:

@Component
public class Foo {
    private final Scheduler scheduler;
    private final CronTriggerFactoryBean cronTriggerFactory;
    private final JobDetailFactoryBean jobDetailFactory;

    @EventListener(ApplicationReadyEvent.class)
    public void onApplicationReadyEvent() {
        var fooTrigger = cronTriggerFactory.getObject();
        var fooJob = jobDetailFactory.getObject()
        scheduler.scheduleJob(fooJob, fooTrigger);
    }
 }

相关问题