Spring批处理SystemCommandTasklet抛出空指针异常

时间:2017-02-09 16:38:07

标签: spring spring-boot spring-batch

我是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

1 个答案:

答案 0 :(得分:2)

您没有将SystemCommandTasklet注册为StepExecutionListener,因为您没有在@Bean方法上返回实现类,Spring Batch不知道tasklet实现了那个界面。我建议两件事要安全:

  1. 将tasklet的配置方法签名更改为: @Bean @StepScope public SystemCommandTasklet sortingTasklet() throws Exception {

  2. 在您的步骤中将tasklet注册为侦听器,类似于您使用CustomStepExecutionListener执行此操作的方式。