我是Spring Batch的新手,我正在尝试使用SystemCommandTasklet作为第二步在批处理之后运行linux sort命令。但是,它在排序较大的文件时抛出NullPointerException(需要一些时间,大约250 MB)。看起来SystemCommandTasklet无法在beforeStep()中初始化StepExecution并抛出错误。有人可以检查我的配置,让我知道我是否缺少一些导致这种情况的配置?
BatchConfig.java
@Bean
public Job job() throws Exception {
return jobs.get("job")
.incrementer(new RunIdIncrementer())
.flow(step1()).on("FAILED").fail().on("COMPLETED").to(step2())
.end()
.build();
}
@Bean
public Step step1() {
return steps.get("step1")
.<FileEntry,FileEntry>chunk(100)
.reader(reader()).faultTolerant().skipLimit(MAX_SKIP_LIMIT).skip(FlatFileParseException.class)
.processor(new Processor())
.writer(compositeWriter()).stream(outputwriter()).stream(rejectwriter())
.listener(new CustomStepExecutionListener())
.build();
}
@Bean
public Step step2() throws Exception {
return steps.get("step2")
.tasklet(sortingTasklet())
.build();
}
@Bean
@StepScope
public Tasklet sortingTasklet() throws Exception {
SystemCommandTasklet tasklet = new SystemCommandTasklet();
logger.debug("Sorting File : " + getOutputFileName());
tasklet.setCommand(new String("sort " + getOutputFileName() + " -d -s -t \001 -k1,1 -o " + getOutputFileName() + ".sorted "));
tasklet.setTimeout(600000l);
return tasklet;
}
这是指向SystemCommandTasklet的SpringBatch源代码的链接,它在第131行抛出NullPointerException。
https://github.com/spring-projects/spring-batch/blob/master/spring-batch-core/src/main/java/org/springframework/batch/core/step/tasklet/SystemCommandTasklet.java
答案 0 :(得分:2)
您没有将SystemCommandTasklet
注册为StepExecutionListener
,因为您没有在@Bean
方法上返回实现类,Spring Batch不知道tasklet实现了那个界面。我建议两件事要安全:
将tasklet的配置方法签名更改为:
@Bean
@StepScope
public SystemCommandTasklet sortingTasklet() throws Exception {
在您的步骤中将tasklet注册为侦听器,类似于您使用CustomStepExecutionListener
执行此操作的方式。