首页 文章

使用Springboot和Quartz使用自己的Cron表达式调度多个作业

提问于
浏览
1

我已经使用SpringBoot和Quartz成功开发了一个应用程序,它只使用为该特定作业定义的Cron表达式执行单个作业 . 我的实现主要基于以下文章中的信息 .

https://chynten.wordpress.com/2016/06/17/quartz-with-databse-and-spring-4/

在那里,正如您所看到的,作业触发是使用封装cron表达式的bean完成的 .

@Bean
public Trigger simpleJobTrigger(@Qualifier("simpleJobDetail") JobDetail jobDetail) {

    CronTriggerFactoryBean factoryBean = new CronTriggerFactoryBean();
    factoryBean.setJobDetail(jobDetail);
    factoryBean.setStartDelay(0L);
    factoryBean.setName("test-trigger");
    factoryBean.setStartTime(LocalDateTime.now().toDate());
    factoryBean.setCronExpression("0/20 * * * * ?");
    factoryBean.setMisfireInstruction(SimpleTrigger.MISFIRE_INSTRUCTION_FIRE_NOW);

    try {
        factoryBean.afterPropertiesSet();
    } catch (ParseException e) {
        e.printStackTrace();
    }
    return factoryBean.getObject();
}

现在,我需要创建多个应该根据自己的cron表达式触发的作业 . 在上面的例子中,整个项目只有一个cron,因此我没有问题 . 但现在,不同的工作应该有不同的调度 .

如何扩展当前的实现以支持具有不同crons的多个作业?是的,我对此做了一些研究,但找不到有关如何配置Spring启动bean以满足我的要求的任何信息 .

一些例子使用quartz JobBuilder 来定义作业 . 这是我应该遵循的方式,还是可以扩展我当前的实现以支持多个工作?

以下链接中的问题看起来非常相似,但我无法理解如何将不同的cron表达式和其他指令(如失火指令)分别传递给每个作业 .

Autowiring in Quartz multiple Jobs with Spring Boot not working

2 回答

  • 0

    您可以在 schedulerFactoryBean() 中添加多个以逗号分隔的触发器作为 setTriggers 方法的参数,例如您提到的方法,因为 setTriggers 接受触发器的varagrs作为参数

    public void setTriggers(Trigger... triggers)
    

    参考SchedulerFactoryBean API

    每个触发器可以有不同的作业详细信息

  • 0

    你只需要做这样的事情 . 继续为每个新工作添加新bean

    @Bean
    public Trigger simpleJobTrigger(@Qualifier("simpleJobDetail") JobDetail jobDetail) {
    
        CronTriggerFactoryBean factoryBean = new CronTriggerFactoryBean();
        factoryBean.setJobDetail(jobDetail);
        factoryBean.setStartDelay(0L);
        factoryBean.setName("test-trigger");
        factoryBean.setStartTime(LocalDateTime.now().toDate());
        factoryBean.setCronExpression("0/20 * * * * ?");
        factoryBean.setMisfireInstruction(SimpleTrigger.MISFIRE_INSTRUCTION_FIRE_NOW);
    
        try {
            factoryBean.afterPropertiesSet();
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return factoryBean.getObject();
    }
    
    @Bean
    public Trigger sendSmsJobTrigger(@Qualifier("sendSmsJobDetail") JobDetail jobDetail) {
    
        CronTriggerFactoryBean factoryBean = new CronTriggerFactoryBean();
        factoryBean.setJobDetail(jobDetail);
        factoryBean.setStartDelay(0L);
        factoryBean.setName("sms-trigger");
        factoryBean.setStartTime(LocalDateTime.now().toDate());
        factoryBean.setCronExpression("0/20 1 1 * * ?");
        factoryBean.setMisfireInstruction(SimpleTrigger.MISFIRE_INSTRUCTION_FIRE_NOW);
    
        try {
            factoryBean.afterPropertiesSet();
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return factoryBean.getObject();
    }
    

相关问题