The Delegate Pattern and Registering with the Step

请注意,CompositeItemWriter 是委派模式的一个例子,它在 Spring Batch 中很常见。委托本身可能会实现回调接口,例如 StepListener。如果它们这样做并且与 Spring Batch Core 一起用作 Job 中的 Step 的一部分,那么几乎可以肯定需要手动将它们注册到 Step 中。如果读取器、写入器或处理器直接连接到 Step,并且它实现了 ItemStreamStepListener 接口,那么它会自动注册。然而,由于 Step 不知道委托,因此需要将它们注入为侦听器或流(或两者,如果适用)。

Java

以下示例展示了如何在 Java 中将委托注入为流:

Java Configuration
@Bean
public Job ioSampleJob(JobRepository jobRepository, Step step1) {
	return new JobBuilder("ioSampleJob", jobRepository)
				.start(step1)
				.build();
}

@Bean
public Step step1(JobRepository jobRepository, PlatformTransactionManager transactionManager) {
	return new StepBuilder("step1", jobRepository)
				.<String, String>chunk(2, transactionManager)
				.reader(fooReader())
				.processor(fooProcessor())
				.writer(compositeItemWriter())
				.stream(barWriter())
				.build();
}

@Bean
public CustomCompositeItemWriter compositeItemWriter() {

	CustomCompositeItemWriter writer = new CustomCompositeItemWriter();

	writer.setDelegate(barWriter());

	return writer;
}

@Bean
public BarWriter barWriter() {
	return new BarWriter();
}
XML

以下示例展示了如何在 XML 中将委托注入为流:

XML Configuration
<job id="ioSampleJob">
    <step name="step1">
        <tasklet>
            <chunk reader="fooReader" processor="fooProcessor" writer="compositeItemWriter"
                   commit-interval="2">
                <streams>
                    <stream ref="barWriter" />
                </streams>
            </chunk>
        </tasklet>
    </step>
</job>

<bean id="compositeItemWriter" class="...CustomCompositeItemWriter">
    <property name="delegate" ref="barWriter" />
</bean>

<bean id="barWriter" class="...BarWriter" />