Flow
作业流,Spring Batch 支持一个Job中配置多个Step,不同的Step可以顺序执行,也可以按照不同的条件有选择地执行(条件通常使用Step的退出状态决定),通过next 元素或 decision 元素来定义跳转规;此外还允许多个step并行执行,通过split 元素来定义。
顺序Step
配置如:
<job id="xxJob">
<step id="stepA" next="stepB"/>
<step id="stepB" next="stepC"/>
<step id="stepC"/>
</job>
条件Step
通过 next 元素实现: 属性:
- on 当step的ExitStatus 和 该属性值匹配时,则执行to指定的作业步。属性值可以是任意的字符串,同时支持通配符
*
?
*
表示退出状态为任何值都满足?
表示匹配一个字符串,如:C?T, 当退出状态为 CAT时候满足
- to 指定下一个需要执行的step
示例配置如:
<job id="xxJob">
<step id="stepA" next="stepB"/>
<step id="stepB" >
<next on="*" to="stepC"/>
<next on="MY_EXIT_CODE" to="stepD"/>
</step>
<step id="stepC" next="stepD"/>
<step id="stepD"/>
</job>
通过decision 元素实现
属性:
- id Job定义中的唯一ID
- decider 条件决定器的实现BeanID,需要实现接口 JobExecutionDecider
子元素:
<decision id="" decider="">
<next on="" to=""/>
<stop on="" restart=""/>
<fail on=""/>
<end on=""/>
</decision>
示例配置如:
<job id="xxJob">
<step id="stepA" next="myDecision"/>
<decision id="myDecision" decider="xxDecisionImpl">
<next on="*" to="stepB"/>
<next on="MY_EXIT_CODE" to="stepC"/>
</decision>
<step id="stepB" next="stepC"/>
<step id="stepC" />
</job>
并行Step
通过Split 元素可以定义并行的作业流,为Split定义线程池,从而提高Job的执行效率
属性
- id 定义split的唯一ID,全局需要保证id唯一
- task-executor 指线程池。如果不定义默认使用SyncTaskExecutor
- next 当前split 中所有的flow执行完毕后,接下来执行的Step
子元素
<split id="" task-executor="" next="">
<fail on=""/>
<next on="" to=""/>
<end on=""/>
<stop on="" restart=""/>
<flow parent=""/> <!--用来定义并行处理的作业,并列的flow表示可以并行处理的任务;split元素下面可以定义多个flow节点-->
</split>
示例配置如:
<job id="xxJob">
<split id="split" next="stepD">
<flow>
<step id="stepA" next="stepB"/>
<step id="stepB"/>
</flow>
<flow>
<step id="stepC"/>
</flow>
</split>
<step id="stepD"/>
</job>
如上配置split 中的 flow 之间是并行执行的,只有当split内部所有的flow执行完毕后,才会继续执行next属性指定的step
外部Flow定义
job 的flow 元素引用外部 flow
示例配置:
<flow id="myFlow">
<step id="stepA" next="stepB"/>
<step id="stepB"/>
</flow>
<job id="xxJob">
<flow id="outerFlow" parent="myFlow" next="stepC"/>
<step id="stepC"/>
</job>
FlowStep 在Step元素中使用Flow。意味着将Flow作为一个Tasklet,在Job执行期间出现(将Flow定义的所有Step包装在一个大的Step中)。示例配置:
<flow id="myFlow">
<step id="stepA" next="stepB"/>
<step id="stepB"/>
</flow>
<job id="xxJob">
<step id="stepC" next="stepD">
<flow parent="myFlow"/>
</step>
<step id="stepD"/>
</job>
JobStep
在Step元素中使用Job。意味着将Job作业一个Tasklet,也可以说这个Job只是一个Step(该Step将Job中定义的所有Step包装在一个大的Step中)。示例配置:
<job id="jobA">
<step id="xxStep"/>
</job>
<job id="jobB">
<step id="stepA" next="stepC">
<job ref="jobA" job-launcher="" job-parameters-extractor=""/>
</step>
<step id="stepC"/>
</job>
来源:oschina
链接:https://my.oschina.net/u/2552286/blog/3169392