好久没更新了,事情太多了,一直再忙着领域驱动设计的落地,过段时间会发布DDD的文章。
前提,quartz的基础这里不说了,网上一大堆,最近接手一个重构底层项目,要做调度任务,应该选型的时候考虑到分布式和微服务,所以就用了quartz。
问题:一切流程都正常,配置JobDataMap,任务也能获取到相对应的数据,但重启服务,重新在数据库获取job_data的时候,发现执行任务拿不到保存的JobDataMap数据,看quartz的表里面,job_data是有值。
解决:一开始以为这个框架的bug,想着直接读数据库把这个job_data的值读出来就算了,后来发现是自己的打开方式错了,一开始是在网上仿照了一下别人的用法,只是在trigger上面的jobDataMap添加数据,所以在任务直接执行的时候是可以拿到设置的数据,但quartz保存到数据库的jobDataMap是在jobDetail里面,看表结构就知道了,问题迎刃而解。本来就没保存到数据,所以就没有获取到数据,虽然看表里是有数据,获取到了,但实际转化不了的,本来就是空的。
Class<? extends Job> jobClass = (Class<? extends Job>) Class.forName(clazzName);
JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(jobName, groupName).withDescription(description).build();
// 表达式调度构建器(即任务执行的时间)
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cronExp).withMisfireHandlingInstructionDoNothing();
// 按新的cronExpression表达式构建一个新的trigger
CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(jobName, groupName).withSchedule(scheduleBuilder).build();
// 获得JobDataMap,写入数据
if (param != null) {
trigger.getJobDataMap().putAll(param);
jobDetail.getJobDataMap().putAll(param);
}
scheduler.scheduleJob(jobDetail, trigger);