春のプロジェクトでも同様の問題がありましたが、特に春のBATCH 1です。以下のように最初に設定を作成しました
@Configuration
public class BatchConfig
{
@Bean
public Job job(@Autowired Step stepMulti, @Autowired Step stepMultiDiff, @Autowired Step stepMultiPolling
){
Job job = jobBuilders.get("job")
.start(init0())
.on("POLLING").to(stepMultiPolling)
.from(init0()).on("*").to(stepMulti).next(stepMultiDiff).end()
.build();
return job;
}
@Bean
public Step init0(){
return stepBuilders.get("init0")
.tasklet(new MyDecider())
.build();
}
...
}
以下のようにMyDeciderを使用してすぐに
public class MyDecider implements StepExecutionListener , Tasklet{
@Autowired ThreadPoolTaskScheduler taskScheduler;
@Value("${read.chunk.size}") private Integer pagesize;
@Override
public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {
return RepeatStatus.FINISHED;
}
@Override
public ExitStatus afterStep(StepExecution exe) {
String type = exe.getJobParameters().getString("mode");
log.info("SPRING BATCH props:");
log.info(" READ chunk size: {}", pagesize);
if (StringUtils.equals(type, "send")) {
log.info("MODE batch SENDING...");
if (taskScheduler !=null) taskScheduler.shutdown();
else log.info(" Not able to stop scheduler (is null)");
return new ExitStatus("SEND");
} else {
log.info("MODE batch POLLING...");
return new ExitStatus("POLLING");
}
}
しかし、この方法では、taskScheduler が配線されたり、ページサイズが注入されたりすることはありませんでした。どちらもヌル。Borisの回答のおかげで、いくつか試した後、BatchConfigを以下のように完全に機能するように変更しました
...
@Bean
public Step init0(){
return stepBuilders.get("init0")
.tasklet(decider())
.build();
}
@Bean
public Tasklet decider() {
return new MyDecider();
}
...
理由: MyDecider の構築を BatchConfig の Bean アノテーション (決定者()のアノテーション) に近づけることで、Application.property 値で見つかった値を使用して MyDecider を適切に注入し、TaskScheduler を使用して配線する必要があることを Spring に理解させます (私が試したため)また、SpringScheduler をアクティブ化する必要がありますが、jar 開始オプションが「send」の場合はオフにしたかったのです)。
注: オプション mode="send" を使用すると、Spring バッチ ジョブは stepMultiPolling ではなく stepMulti に進みます。これは、MyDecider の終了ステータスが POLLING ではなく SEND であったためです。しかし、それはこのトピックからの説明にすぎないため、詳細は省略します。
この春のバッチケースが誰かの役に立ちますように!