Spring Batch

时光毁灭记忆、已成空白 提交于 2020-02-27 00:34:39

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>
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!