【问题标题】:getJobDataMap in Quartz gives Null Pointer exceptionQuartz 中的 getJobDataMap 给出空指针异常
【发布时间】:2017-12-12 19:51:33
【问题描述】:

我正在尝试将一些数据放入 Quartz 作业数据映射中,并在实现 Job 类的类中访问它们。但它给了我空指针异常。当应用程序在没有访问作业数据映射的代码的情况下运行时,它运行良好。

我使用 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 ?我应该设置任何配置或属性吗?工作地图此时无法使用的原因是什么? 我该如何解决这个问题?

【问题讨论】:

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


    【解决方案1】:

    在我的代码中发现了问题。 在访问 JobDataMap 时,我通过以下方式访问它。

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

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

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

    【讨论】:

      猜你喜欢
      • 2014-09-06
      • 2014-07-19
      • 2017-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多