我正在尝试将一些数据放入Quartz作业数据映射中,并在实现Job类的类中访问它们。但它给了我Null指针异常。在没有访问作业数据映射的代码的情况下运行应用程序时,它运行正常。
我使用Cron触发器来执行预定作业。在这个示例中,我将其配置为每20秒运行一次。
@Bean
public Trigger simpleJobTrigger(@Qualifier("simpleJobDetail") JobDetail jobDetail) {
CronTriggerFactoryBean factoryBean = new CronTriggerFactoryBean();
factoryBean.setJobDetail(jobDetail);
factoryBean.setStartDelay(0L);
factoryBean.setName("test-trigger");
factoryBean.setStartTime(LocalDateTime.now().toDate());
factoryBean.setCronExpression("0/20 * * * * ?");
factoryBean.setMisfireInstruction(SimpleTrigger.MISFIRE_INSTRUCTION_FIRE_NOW);
try {
factoryBean.afterPropertiesSet();
} catch (ParseException e) {
e.printStackTrace();
}
return factoryBean.getObject();
}
以下是我的simpleJobDetail
bean。
@Bean
public JobDetailFactoryBean simpleJobDetail() {
JobDetailFactoryBean factoryBean = new JobDetailFactoryBean();
factoryBean.setJobClass(Executor.class);
factoryBean.setDurability(true);
factoryBean.setName("test-job");
factoryBean.getJobDataMap().put("caller", "James");
return factoryBean;
}
这是我的execute
方法。
public class Executor implements Job {
@Autowired
ScheduledTaskService scheduledTaskService;
@Override
public void execute(JobExecutionContext jobExecutionContext) {
JobDataMap jobDataMap = null;
try {
jobDataMap = jobExecutionContext.getTrigger().getJobDataMap();
String caller = jobDataMap.get("caller").toString();
System.out.println("This is called by the user "+caller);
} catch (Exception e) {
//e.printStackTrace();
System.out.println("UNABLE TO ACCESS THE JOB DATA MAP "+e);
}
scheduledTaskService.doThePayment();
}
}
当我运行应用程序时,它会打印catch子句中给出的日志。
无法访问作业数据映射java.lang.NullPointerException
为什么execute方法无法访问JobDataMap?我应该设置任何配置或属性吗?目前无法提供工作地图的原因是什么? 我怎样才能解决这个问题?
答案 0 :(得分:0)
在我的代码中发现了这个问题。 访问JobDataMap时,我已按以下方式访问它。
jobDataMap = jobExecutionContext.getTrigger().getJobDataMap();
相反,在我的情况下,我应该从JobDetails访问它,而不是从触发器访问它。
jobDataMap = jobExecutionContext.getJobDetail().getJobDataMap();