我已经使用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
答案 0 :(得分:0)
您可以添加多个以逗号分隔的触发器,作为setTriggers
中schedulerFactoryBean()
方法的参数,从您提到的方法示例setTriggers
接受触发器的varagrs作为参数
public void setTriggers(Trigger... triggers)
您可以为每个触发器设置不同的作业详细信息
答案 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();
}