使用Springboot和Quartz

时间:2017-10-04 07:29:36

标签: java spring-boot quartz-scheduler

我已经使用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 :(得分:0)

您可以添加多个以逗号分隔的触发器,作为setTriggersschedulerFactoryBean()方法的参数,从您提到的方法示例setTriggers接受触发器的varagrs作为参数

public void setTriggers(Trigger... triggers)

参考enter image description here

您可以为每个触发器设置不同的作业详细信息

答案 1 :(得分: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();
}