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

配置 Step

尽管 Step 所需的必备依赖看起来并不多,但它本身是一个相当复杂的类, 并且可能包含大量协作组件。

  • Java

  • XML

使用 Java 配置时,你可以使用 Spring Batch 提供的构建器,如下例所示:

Java Configuration
/**
 * Note the JobRepository is typically autowired in and not needed to be explicitly
 * configured
 */
@Bean
public Job sampleJob(JobRepository jobRepository, Step sampleStep) {
    return new JobBuilder("sampleJob", jobRepository)
                .start(sampleStep)
                .build();
}

/**
 * Note the TransactionManager is typically autowired in and not needed to be explicitly
 * configured
 */
@Bean
public Step sampleStep(JobRepository jobRepository, (1)
		PlatformTransactionManager transactionManager) { (2)
	return new StepBuilder(jobRepository) (3)
				.<String, String>chunk(10).transactionManager(transactionManager) (4)
				.reader(itemReader())
				.writer(itemWriter())
				.build();
}
1 repository:这是 Java 配置方式下对 JobRepository 的专用命名。 它会在处理过程中定期保存 StepExecutionExecutionContext (具体发生在事务提交之前)。
2 transactionManager:Spring 的 PlatformTransactionManager, 负责在处理过程中开启和提交事务。
3 Step 名称:当 step 被声明为一个 bean 时,名称可以省略,框架会从方法名推导出来。 但如果该 step 不是以 bean 方式定义,那么就必须在 StepBuilder 构造器中显式提供名称, 例如 new StepBuilder("myStep", jobRepository)
4 chunk:这是 Java 配置方式下的专用命名,用于表明这是一个基于 item 的 step, 以及在事务提交之前要处理多少个 item。
请注意,repository 默认是 jobRepository(由 @EnableBatchProcessing 提供), 而 transactionManager 默认是 transactionManager(由应用上下文提供)。 事务管理器是可选的,默认值为 ResourcelessTransactionManager。 另外,ItemProcessor 也是可选的,因为 item 也可以直接从 reader 传递给 writer。

为了简化配置,你也可以使用 Spring Batch 的 XML 命名空间,如下例所示:

XML Configuration
<job id="sampleJob" job-repository="jobRepository"> (2)
    <step id="step1">
        <tasklet transaction-manager="transactionManager"> (1)
            <chunk reader="itemReader" writer="itemWriter" commit-interval="10"/> (3)
        </tasklet>
    </step>
</job>
1 transaction-manager:Spring 的 PlatformTransactionManager, 负责在处理过程中开启和提交事务。
2 job-repository:这是 XML 配置方式下对 JobRepository 的专用命名。 它会在处理过程中定期保存 StepExecutionExecutionContext (即在提交之前)。对于内联定义的 <step/>(也就是定义在 <job/> 里的 step), 它是 <job/> 元素上的一个属性;对于独立定义的 <step/>, 它则定义为 <tasklet/> 的一个属性。
3 commit-interval:这是 XML 配置方式下对“事务提交前处理 item 数量”的专用命名。
请注意,job-repository 默认是 jobRepositorytransaction-manager 默认是 transactionManager。 另外,ItemProcessor 也是可选的,因为 item 可以直接从 reader 传递给 writer。

前面的配置已经包含了创建一个面向 item 的 step 所需的全部必备依赖:

  • reader:为处理流程提供 item 的 ItemReader

  • writer:处理并写出由 ItemReader 提供的 item 的 ItemWriter

step 中使用的事务管理器可以不同于 job repository 所使用的事务管理器。 但这里有一个前提:job repository 和实际处理所使用的数据库将不会处于同一个事务中。 因此,如果在处理完成之后、但在 job repository 更新之前发生失败,这个 step 就可能被再次执行, 从而导致重复处理。这个问题可以通过幂等处理,或者借助外部事务管理(例如 JTA)来缓解。