Step介绍
Step介绍
Step表示作业中的一个完整步骤,一个Job可以由一个或者多个Step组成。 Step包含一个实际运行的批处理任务中所有必须的信息。
面向chunk的处理方式
Spring Batch在大多数实现中使用“面向chunk”的处理风格。面向chunk的处理风格是指,在一个事务内,一次读取一批数据并将该数据输出。
一旦读取的数据项数等于chunk中定义的commit-interval的值,那么整批出具将由writer输出,然后提交事务。相关过程如下图所示:
相关伪代码如下:
List items = new Arraylist();
for(int i = 0; i < commitInterval; i++){
Object item = itemReader.read();
if (item != null) {
items.add(item);
}
}
itemWriter.write(items);
可以在chunk中定义ItemProcessor来处理数据。相关图示如下: 相关伪代码如下:
List items = new Arraylist();
for(int i = 0; i < commitInterval; i++){
Object item = itemReader.read();
if (item != null) {
items.add(item);
}
}
List processedItems = new Arraylist();
for(Object item: items){
Object processedItem = itemProcessor.process(item);
if (processedItem != null) {
processedItems.add(processedItem);
}
}
itemWriter.write(processedItems);
step的属性
属性 | 说明 | 默认值 |
---|---|---|
id | Step的唯一标识,在整个运行上下文中不允许重复 | |
next | 当前step执行完成后,next元素指定下一个需要执行的step | |
parent | 定义当前step的父step。step可以从其他step继承。通常在父step中定义共有的属性,在子step中定义特有的属性。如果父子都有的属性以子类中定义的为准,即子类属性会覆盖父类属性。 | |
job-repository | 定义该step运行期间使用的step仓库,默认使用名字为jobRepository的Bean。该属性只有在step为顶层元素时候生效。 | jobRepository |
abstract | 定义当前step是否有抽象的。true表示当前step是抽象的,不能被实例化。该属性只有在step为顶层元素时候生效。 | false |
parent属性
如果一组step拥有相似的配置,那么可以定义一个parent
step来拥有那些配置,让这一组step都继承自这个parent
step。Spring Batch中的step继承,类似于Java中的类继承。
<step id="parentStep">
<tasklet allow-start-if-complete="true">
<chunk reader="itemReader" writer="itemWriter" commit-interval="10"/>
</tasklet>
</step>
<step id="concreteStep1" parent="parentStep">
<tasklet start-limit="5">
<chunk processor="itemProcessor" commit-interval="5"/>
</tasklet>
</step>
以上示例中,id为concreteStep1的step继承自id为parentStep的step。那么它具有继承自parentStep的配置:itemReader、itemWriter、allow-start-if-complete="true",还有自定义的配置:itemProcessor、commit-interval="5"。因为在concreteStep1中重定义了commit-interval配置,那么便不会使用从parentStep继承而来的commit-interval="10"的配置。
abstract属性
对于一个step,必须要定义tasklet、reader和writer这三个元素,否则该step将实例化失败。如果一个step没有定义tasklet、reader和writer,那么必须设置abstract=true
。
<step id="parentStep">
<tasklet allow-start-if-complete="true">
<chunk reader="itemReader" writer="itemWriter" commit-interval="10"/>
</tasklet>
</step>
<step id="concreteStep1" parent="parentStep">
<tasklet start-limit="5">
<chunk processor="itemProcessor" commit-interval="5"/>
</tasklet>
</step>
step的子元素
属性 | 说明 |
---|---|
tasklet | 定义具体作业步的执行逻辑 |
partition | 定义当前任务是分区执行的,需要使用partition元素来声明Step |
job | 引用独立配置的Job作为任务 |
flow | 引用独立配置的Flow作为任务 |
next | 根据退出状态定义下一步需要执行的Step |
stop | 根据退出状态决定是否退出当前的任务,同时Job也会停止,作业状态为"STOPPED" |
end | 根据退出状态决定是否结束当前的任务,同时Job也会停止,作业状态为"COMPLETED" |
fail | 根据退出状态决定是否当前的任务失败,同时Job也会停止,作业状态为"FAILED" |
listeners | 定义作业步的拦截器 |