たとえば、readerが整数を読み込み、偶数・奇数で異なるwriterを呼び出す、という例を考える。
import org.springframework.batch.core.Job;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.ItemWriter;
import org.springframework.batch.item.support.ClassifierCompositeItemWriter;
import org.springframework.batch.item.support.ListItemReader;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
@EnableBatchProcessing
public class App {
@Bean
public Job job(JobBuilderFactory jobs, StepBuilderFactory steps) {
return jobs
.get("job")
.start(step1(steps))
.build();
}
ItemWriter<Integer> evenWriter() {
return items -> items.forEach(i -> System.out.println("偶数" + i));
}
ItemWriter<Integer> oddWriter() {
return items -> items.forEach(i -> System.out.println("奇数" + i));
}
public Step step1(StepBuilderFactory stepBuilderFactory) {
ItemReader<Integer> reader = new ListItemReader<Integer>(IntStream.range(0, 100).boxed().collect(Collectors.toList()));
ClassifierCompositeItemWriter<Integer> compositeWriter = new ClassifierCompositeItemWriter<Integer>();
compositeWriter.setClassifier(number -> {
if (number % 2 == 0) {
return evenWriter();
}
return oddWriter();
});
return stepBuilderFactory
.get("step1")
.<Integer, Integer>chunk(4)
.reader(reader)
.writer(compositeWriter)
.build();
}
public static void main(String[] args) {
new SpringApplicationBuilder(App.class).run(args);
}
}
ClassifierCompositeItemWriter
は自身がwriterで、指定されたルーティングパターンを基に呼び出すwriterを切り替える。
これを実行すると以下のようになる。
偶数0
偶数2
奇数1
奇数3
...
chunk(4)
なので、4件ごとに偶数・奇数writerがそれぞれ1度ずつ呼び出されている。