[英]Spring Autowire Quartz Scheduler
我的Web服務器中運行着一個石英作業,該作業通過Spring進行如下配置:
@Configuration
public class StatisticsJobConfig {
@Bean
public JobDetailBean jobDetailBean() {
JobDetailBean jobDetailBean = new JobDetailBean();
jobDetailBean.setJobClass(StatisticsJob.class);
jobDetailBean.setBeanName("statisticsJobBean");
jobDetailBean.setName("statisticsJob");
jobDetailBean.setGroup("default");
return jobDetailBean;
}
@Bean
public CronTriggerBean cronTriggerBean(@Qualifier("jobDetailBean") JobDetailBean jobDetailBean) throws ParseException {
CronTriggerBean cronTriggerBean = new CronTriggerBean();
cronTriggerBean.setBeanName("cronTriggerBean");
cronTriggerBean.setJobDetail(jobDetailBean);
cronTriggerBean.setCronExpression("0/5 * * * * ?");
return cronTriggerBean;
}
@Bean
public SchedulerFactoryBean schedulerFactoryBean(@Qualifier("cronTriggerBean") CronTriggerBean cronTriggerBean
, @Qualifier ApplicationContext applicationContext) {
SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
schedulerFactoryBean.setExposeSchedulerInRepository(true);
schedulerFactoryBean.setTriggers(cronTriggerBean);
AutowiringSpringBeanJobFactory jobFactory = new AutowiringSpringBeanJobFactory();
jobFactory.setApplicationContext(applicationContext);
schedulerFactoryBean.setJobFactory(jobFactory);
return schedulerFactoryBean;
}
public void setCronExpression(String cronExpression) {
this.cronExpression = cronExpression;
}
}
(StatisticsJob類擴展了QuartzJobBean並實現了executeInternal方法)。
服務器啟動后,該作業將按照cron表達式成功執行。 但是,我還希望能夠隨意安排這項工作,就像用戶按下按鈕時一樣。 為了做到這一點,我在控制器內創建了一個restful方法,我想在其上注入石英調度程序,如下所示:
@RequestMapping(value = "/triggerJob", method = RequestMethod.GET)
public ResponseEntity<String> triggerJob(@Qualifier StdSchedulerFactory schedulerFactory) {
try {
Scheduler scheduler = schedulerFactory.getScheduler();
JobDetail jobDetail = new JobDetail("statisticsJob",StatisticsJob.class);
scheduler.scheduleJob(jobDetail,TriggerUtils.makeImmediateTrigger("new",0, 0));
} catch (SchedulerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return new ResponseEntity<>(HttpStatus.OK);
}
但是,即使執行了上面的代碼,也從未計划過作業。 我做錯了什么? 我可以嘗試另一種方法嗎?
解決方案是在我的Controller中自動連接SchedulerFactoryBean本身,並在可通過其訪問的調度程序上調用rescheduleJob方法:
@Autowired
private SchedulerFactoryBean schedulerFactory;
@RequestMapping(value = "/triggerJob", method = RequestMethod.GET)
public ResponseEntity<String> triggerJob() {
try {
schedulerFactory.getScheduler().triggerJob("statisticsJob", "default");
} catch (SchedulerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return new ResponseEntity<>(HttpStatus.OK);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.