当前版本仍在开发中,尚不被视为稳定版本。最新稳定版请使用 Spring Batch 文档 6.0.2!

委托模式与向 Step 注册

需要注意,CompositeItemWriter 是委托模式的一个例子,而这种模式在 Spring Batch 中很常见。被委托对象本身可能会实现 诸如 StepListener 之类的回调接口。如果确实如此,并且它们作为 Job 中某个 Step 的一部分与 Spring Batch Core 配合使用,那么几乎可以肯定需要把它们手工注册到该 Step 上。直接装配到 Step 中的 reader、writer 或 processor, 只要实现了 ItemStream 或某个 StepListener 接口,就会被自动注册。但由于委托对象本身并不为 Step 所知, 因此需要把它们作为 listener 或 stream 注入进去,如果合适,也可能两者都要注入。

  • Java

  • XML

下面的示例展示了如何在 Java 中把委托对象作为 stream 注入:

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(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 中把委托对象作为 stream 注入:

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" />