我正在将Spring Batch集成到现有的Spring Webapp中,并创建了三个简单的作业作为学习过程。然后,我为作业/读取器/写入器创建了一组祖先类,可用于轻松迁移我们的旧批处理作业。
我们打算在Tomcat中作为单独的线程异步运行作业。我创建了一个UI来管理和启动/停止它们。
我有一个用@Configuration和@EnableBatchProcessing注释的类,它负责为批处理模式设置所有全局类。然后,它还会针对特定祖先类别扫描所有工作的基本软件包。然后为相应的* Factory类添加每个类名的后缀,为该类做一个getBean并使用它注册每个作业:
Job job = jobFactory.createInstanceForRegistration();
jobRegistry.register(new ReferenceJobFactory(job));
createInstanceForRegistration方法使用applicationContext.getBean获取job / read / writer类的实例,以将作业和步骤放在一起,然后最终:
((SimpleJob)job).setSteps(steps);
return job;
在用户界面中,列出了作业,我应该能够启动它们。但是当我这样做时:
batchAuditId = jobOperator.start(jobName, parameters);
突然,从w / i AbstractJob / execute抛出一条NPE @ 298行:
jobParametersValidator.validate(execution.getJobParameters());
因为jobParametersValidator为空-尽管它是使用类本身的默认值初始化的:
private JobParametersValidator jobParametersValidator =
new DefaultJobParametersValidator();
更重要的是,作业类构造函数的代码可以设置多个项目,包括验证程序的覆盖:
super(BATCH_NAME, BATCH_TYPE_CODE, BATCH_FUNCTION, BATCH_PROCESS_AREA);
setLogger(LoggerFactory.getLogger(CustomJob.class));
getLogger().debug("constructed: {}", this.toString());
setParametersRequired(Boolean.TRUE); // this job requires parameters
setRestartable(Boolean.TRUE);
setJobParametersValidator(new CustomJobParametersValidatorImpl());
在部署期间,当Spring创建所有类时,我可以单步执行代码,并为该作业创建并设置覆盖验证器。
但是,当jobOperator.start执行时,会抛出NPE。
我找不到原因。几乎就像jobOperator.start一样,它以某种方式创建了作业类的新实例,而不使用现有实例或我的自定义构造函数。
任何人都可以解释发生了什么事吗?