RunQuartz实现InitializingBean进行初始化并注入schedulerFactoryBean,如果scope不设置为protorype就会报错如图:![图片说明](https://img-ask.csdn.net/upload/201708/03/1501752563_984249.png)
将scope设为protorype后定时任务就一直不执行,打印batch acquisition of 0 triggers。
RunQuartz代码如下:
public class RunQuartz implements InitializingBean{
private SchedulerFactoryBean schedulerFactoryBean;
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("++++++++++++++init方法");
List<ScheduleJob> jobList = new ArrayList<>();
for (int i = 0; i < 5; i++) {
ScheduleJob job = new ScheduleJob();
job.setJobId("10001" + i);
job.setJobName("data_import" + i);
job.setJobGroup("dataWork");
job.setCronExpression("*/5 * * * * ?");
jobList.add(job);
}
Scheduler scheduler = schedulerFactoryBean.getScheduler();
for (ScheduleJob job : jobList) {
TriggerKey triggerKey = TriggerKey.triggerKey(job.getJobName(), job.getJobGroup());
//获取trigger,即在spring配置文件中定义的 bean id="myTrigger"
CronTrigger trigger = null;
try {
trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
} catch (SchedulerException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
//不存在,创建一个
if (null == trigger) {
JobDetail jobDetail = JobBuilder.newJob(QuartzJobFactory.class)
.withIdentity(job.getJobName(), job.getJobGroup()).build();
jobDetail.getJobDataMap().put("scheduleJob", job);
//表达式调度构建器
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(job.getCronExpression());
//按新的cronExpression表达式构建一个新的trigger
trigger = TriggerBuilder.newTrigger().withIdentity(job.getJobName(), job.getJobGroup()).withSchedule(scheduleBuilder).build();
try {
scheduler.scheduleJob(jobDetail, trigger);
} catch (SchedulerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else {
// Trigger已存在,那么更新相应的定时设置
//表达式调度构建器
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(job.getCronExpression());
//按新的cronExpression表达式重新构建trigger
trigger = trigger.getTriggerBuilder().withIdentity(triggerKey)
.withSchedule(scheduleBuilder).build();
//按新的trigger重新设置job执行
try {
scheduler.rescheduleJob(triggerKey, trigger);
} catch (SchedulerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public SchedulerFactoryBean getSchedulerFactoryBean() {
return schedulerFactoryBean;
}
public void setSchedulerFactoryBean(SchedulerFactoryBean schedulerFactoryBean) {
this.schedulerFactoryBean = schedulerFactoryBean;
}
}