现象:
系统通过配置添加或修改定时任务,每次添加或修改执行时间的时候都会调用下面代码块中的addJob方法,以致每次都创建StdSchedulerFactory对象;总会出现定时任务不执行的问题,是否和这种机制有关?
public static Scheduler getScheduler() throws SchedulerException {
Properties props = new Properties();
props.put(StdSchedulerFactory.PROP_THREAD_POOL_CLASS,"org.quartz.simpl.SimpleThreadPool");
props.put("org.quartz.threadPool.threadCount", "90");
sf = new StdSchedulerFactory(props);
return sf.getScheduler();
}
/**
* 添加一个定时任务
*
* @param jobId 任务名
* @param job 任务
* @param cronExpression trigger设置表达式
* @param jobDataMap job的参数
* @throws SchedulerException
* @throws ParseException
*/
public static void addJob(String jobId, Job job, String cronExpression, String methodName, List<String[]> logInfoList)
throws ParseException, SchedulerException {
String jobName = generateJobName(jobId);
Scheduler scheduler = getScheduler();
//新增job
JobDetail jobDetail = JobBuilder
.newJob(job.getClass())
.withIdentity(jobName, JOB_GROUP_NAME)
.storeDurably()
.build(); //任务名,任务组,任务执行类
scheduler.addJob(jobDetail,true);
System.out.println("-------------------------------------------------------------------------------scheduler.addJob(jobDetail,true); 执行完毕");
logger.info("新增定时任务"+jobName);
//新增触发器
String[] cronExps = StringUtils.splitByWholeSeparator(cronExpression,SEPARATOR);
for(int i=0;i<cronExps.length;i++){
try{
String triggerId = TRIGGER_NAME+jobId+"_"+generateSystime();
CronTrigger trigger = TriggerBuilder
.newTrigger()
.withIdentity(triggerId, TRIGGER_GROUP_NAME).forJob(jobName, JOB_GROUP_NAME)
.withSchedule(CronScheduleBuilder.cronSchedule(cronExps[i]).withMisfireHandlingInstructionFireAndProceed())
.build();
if(logInfoList != null) {
logInfoList.add(new String[]{triggerId, jobName, cronExpression, methodName});
}else {
LoggerUtils.quartzInitLoggerJob(triggerId, jobName, cronExpression, methodName);
}
scheduler.scheduleJob(trigger);
if(!scheduler.isShutdown()) {
scheduler.start();
System.out.println("-------------------------------------------------------------------------------scheduler.start(); 执行完毕");
}
logger.info("新增定时任务触发器"+trigger.getKey().getName());
}catch (SchedulerException ex){
logger.info(ex.getMessage());
System.out.println(ex.getMessage());
continue;
}
}
}
- 通过测试发现,系统刚刚启动时,定时任务是按时执行的,但是随着系统启动时间变长,定时任务就出现延迟执行或不执行的情况,把org.quartz.threadPool.threadCount的数值变大,出现这种情况的时间就推迟;
- 想知道这种代码机制是不是有问题?怎样能保证定时任务肯定会执行且会按时执行?