私はSpring Batchを初めて使用しており、SystemCommandTaskletを2番目のステップとして使用してバッチ処理後にlinux sortコマンドを実行しようとしています。しかし、大きなファイルをソートするときにNullPointerExceptionがスローされます(250 MBほどの時間がかかります)。 SystemCommandTaskletがbeforeStep()でStepExecutionを初期化してエラーをスローすることができないようです。誰かが私の設定をチェックして、これを引き起こしているいくつかの設定が不足しているかどうかを教えてくれますか?ここでSpringバッチSystemCommandTaskletがnullポインタ例外を投げる
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;
}
はあなたがStepExecutionListener
としてSystemCommandTasklet
を登録していないSystemCommandTaskletためSpringBatchのソースコードへのリンク、ラインでその投げNullPointerExceptionが131
https://github.com/spring-projects/spring-batch/blob/master/spring-batch-core/src/main/java/org/springframework/batch/core/step/tasklet/SystemCommandTasklet.java
ありがとうございました。それは今、完璧に動作します。また、私はSpring Batchの大ファンです:) –
@Mihael Minella、どのステップでリスナーとしてタスクレットを登録しますか? – mfunaro
それが使用されたステップ。 –