|
当前版本仍在开发中,尚不被视为稳定版本。最新稳定版请使用 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 的专用命名。
它会在处理过程中定期保存 StepExecution 和 ExecutionContext
(具体发生在事务提交之前)。 |
||
| 2 | transactionManager:Spring 的 PlatformTransactionManager,
负责在处理过程中开启和提交事务。 |
||
| 3 | Step 名称:当 step 被声明为一个 bean 时,名称可以省略,框架会从方法名推导出来。
但如果该 step 不是以 bean 方式定义,那么就必须在 StepBuilder 构造器中显式提供名称,
例如 new StepBuilder("myStep", jobRepository)。 |
||
| 4 | chunk:这是 Java 配置方式下的专用命名,用于表明这是一个基于 item 的 step,
以及在事务提交之前要处理多少个 item。
|
为了简化配置,你也可以使用 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 的专用命名。
它会在处理过程中定期保存 StepExecution 和 ExecutionContext
(即在提交之前)。对于内联定义的 <step/>(也就是定义在 <job/> 里的 step),
它是 <job/> 元素上的一个属性;对于独立定义的 <step/>,
它则定义为 <tasklet/> 的一个属性。 |
||
| 3 | commit-interval:这是 XML 配置方式下对“事务提交前处理 item 数量”的专用命名。
|
前面的配置已经包含了创建一个面向 item 的 step 所需的全部必备依赖:
-
reader:为处理流程提供 item 的ItemReader。 -
writer:处理并写出由ItemReader提供的 item 的ItemWriter。
| step 中使用的事务管理器可以不同于 job repository 所使用的事务管理器。 但这里有一个前提:job repository 和实际处理所使用的数据库将不会处于同一个事务中。 因此,如果在处理完成之后、但在 job repository 更新之前发生失败,这个 step 就可能被再次执行, 从而导致重复处理。这个问题可以通过幂等处理,或者借助外部事务管理(例如 JTA)来缓解。 |