2017-10-04 56 views
1

我已經成功開發了一個SpringBoot和Quartz應用程序,該應用程序只使用爲特定作業定義的Cron表達式執行一個作業。我的實施主要基於以下文章中的信息。使用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,因此我沒有問題。但現在,不同的工作應該有不同的規劃。

如何擴展當前實現以支持具有不同cron的多個作業?是的,我對此做了一些研究,但是找不到有關如何配置Spring引導bean來滿足我的需求的任何信息。

一些示例使用石英JobBuilder來定義作業。這是我應該遵循的方式,還是我可以擴展當前的實施以支持多個工作?

下面的鏈接中的問題看起來很相似,但我無法理解如何分別將不同的cron表達式和其他指令(如失火指令)分別傳遞給每個作業。

Autowiring in Quartz multiple Jobs with Spring Boot not working

回答

0

可以添加由逗號作爲參數用於setTriggers方法在schedulerFactoryBean()從例如,你因爲setTriggers提到的方法接受觸發器的varagrs作爲參數分隔的多個觸發器

public void setTriggers(Trigger... triggers) 

參閱SchedulerFactoryBean API

你可以爲每個觸發器有不同的工作細節

0

你只需要做這樣的事情。只是不斷爲你的新工作添加新豆

@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(); 
}