【发布时间】:2014-06-06 21:41:58
【问题描述】:
我的网络服务器上运行了一个石英作业,通过 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);
}
但是,即使在执行上述代码之后,作业也不会被安排。我做错了什么?我可以尝试其他方法吗?
【问题讨论】: