配置步骤
尽管一个 Step 所需的依赖项列表相对较短,但它是一个极其复杂的类,可能包含许多协作组件。
- Java
- XML
使用 Java 配置时,你可以使用 Spring Batch 构建器,如下例所示:
/**
* 注意 JobRepository 通常通过自动装配注入,无需显式配置
*/
@Bean
public Job sampleJob(JobRepository jobRepository, Step sampleStep) {
return new JobBuilder("sampleJob", jobRepository)
.start(sampleStep)
.build();
}
/**
* 注意 TransactionManager 通常通过自动装配注入,无需显式配置
*/
@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();
}
repository:JobRepository的 Java 特定名称,用于在处理期间(恰好在提交之前)定期存储StepExecution和ExecutionContext。transactionManager:Spring 的PlatformTransactionManager,用于在处理期间开始和提交事务。步骤名称:当步骤被声明为 bean 时,名称可以省略,并将从方法名派生。但是,如果步骤未定义为 bean,则必须像
new StepBuilder("myStep", jobRepository)这样显式地将名称提供给StepBuilder构造函数。chunk:依赖项的 Java 特定名称,表示这是一个基于项的步骤,以及在提交事务之前要处理的项数。
注意 repository 默认为 jobRepository(通过 @EnableBatchProcessing 提供),transactionManager 默认为 transactionManager(从应用上下文提供)。事务管理器是可选的,默认为 ResourcelessTransactionManager。此外,ItemProcessor 是可选的,因为项可以直接从读取器传递给写入器。
- [#] 注意
repository默认为jobRepository(通过@EnableBatchProcessing提供),transactionManager默认为transactionManager(从应用上下文提供)。事务管理器是可选的,默认为ResourcelessTransactionManager。此外,ItemProcessor是可选的,因为项可以直接从读取器传递给写入器。
为了简化配置,你可以使用 Spring Batch XML 命名空间,如下例所示:
<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>
transaction-manager:Spring 的PlatformTransactionManager,用于在处理期间开始和提交事务。job-repository:JobRepository的 XML 特定名称,用于在处理期间(恰好在提交之前)定期存储StepExecution和ExecutionContext。对于内联的<step/>(在<job/>内定义),它是<job/>元素上的一个属性。对于独立的<step/>,它被定义为<tasklet/>的一个属性。commit-interval:在提交事务之前要处理的项数的 XML 特定名称。
注意 job-repository 默认为 jobRepository,transaction-manager 默认为 transactionManager。此外,ItemProcessor 是可选的,因为项可以直接从读取器传递给写入器。
- [#] 注意
job-repository默认为jobRepository,transaction-manager默认为transactionManager。此外,ItemProcessor是可选的,因为项可以直接从读取器传递给写入器。
前面的配置包含了创建面向项目的步骤所需的唯一依赖项:
-
reader: 提供待处理项目的ItemReader。 -
writer: 处理ItemReader所提供项目的ItemWriter。
步骤中使用的交易管理器可能与作业存储库中使用的不同。但需要注意的是,作业存储库和处理数据库不会处于同一交易中,因此如果在处理完成后、作业存储库更新前发生故障,该步骤可能会被重新执行,从而导致重复处理。这可以通过幂等处理或外部交易管理(例如 JTA)来缓解。