Quartz中的getJobDataMap给出Null指针异常

时间:2017-07-08 17:34:45

标签: java spring-boot scheduled-tasks quartz-scheduler

我正在尝试将一些数据放入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?我应该设置任何配置或属性吗?目前无法提供工作地图的原因是什么? 我怎样才能解决这个问题?

1 个答案:

答案 0 :(得分:0)

在我的代码中发现了这个问题。 访问JobDataMap时,我已按以下方式访问它。

jobDataMap = jobExecutionContext.getTrigger().getJobDataMap();

相反,在我的情况下,我应该从JobDetails访问它,而不是从触发器访问它。

jobDataMap = jobExecutionContext.getJobDetail().getJobDataMap();