[JAVA] Schalten Sie den Writer dynamisch entsprechend dem Lesewert mit Spring-Batch

Stellen Sie sich zum Beispiel ein Beispiel vor, in dem ein Leser eine Ganzzahl liest und verschiedene Schreiber für gerade und ungerade Zahlen aufruft.

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("Sogar" + i));
	}

	ItemWriter<Integer> oddWriter() {
		return items -> items.forEach(i -> System.out.println("Seltsam" + 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 </ code> ist selbst ein Writer und schaltet den Writer basierend auf dem angegebenen Routing-Muster auf Aufruf um.

Wenn dies ausgeführt wird, wird es wie folgt.

Sogar 0
Sogar 2
Ungerade 1
Ungerade 3
...

Da es sich um chunk (4) </ code> handelt, werden gerade und ungerade Schreiber alle vier Fälle einmal aufgerufen.

Recommended Posts