繁体   English   中英

带有Flow的Spring Batch jobBuilderFactory

[英]Spring Batch jobBuilderFactory with Flow 'on'

尝试使用基于Java的声明的Spring Batch代替jobBuilderFactory,并使用流程指导条件步骤的执行。 我在“ step2()”的末尾有一个步骤执行侦听器,该侦听器返回一个自定义退出代码,该代码用于选择其后的相应步骤。

我得到的意外行为是,除非我为“ COMPLETED” ExitStatus ExitCode明确定义了开启条件,否则作业状态最终将显示为“ FAILED”。 该代码似乎按预期执行,否则。 案件在下面列出。

我看到这里涉及的类是JobBuilder和FlowBuilder。

问题:

1)为什么案例2A和2B导致作业“失败”?

2)如果可以帮助澄清正在发生的情况,那么以下等价的XML是什么?

// 1. JOB STATUS ends up as COMPLETED
jobBuilderFactory.get("myProcess")
.flow(step1())
.next(step2())
.on(ExitStatus.COMPLETED.getExitCode())
.end()
.on("CUSTOM_EXIT_CODE")
.to(step3())
.end()
.build();

// 2A. JOB STATUS ends up as FAILED
jobBuilderFactory.get("myProcess")
.flow(step1())
.next(step2())
.on("CUSTOM_EXIT_CODE")
.to(step3())
.on(ExitStatus.COMPLETED.getExitCode())
.end()
.end()
.build();

// 2B. JOB STATUS ends up as FAILED
jobBuilderFactory.get("myProcess")
.flow(step1())
.next(step2())
.on("CUSTOM_EXIT_CODE")
.to(step3())
.end()
.build();

默认情况下,所有步骤都将返回ExitStatus.COMPLETED。 如果要返回自定义代码,则您的步骤应显式返回FlowExecutionStatus,例如

return new FlowExecutionStatus("CUSTOM_EXIT_CODE"); 

如果不匹配,它将进入失败状态。

如果你想XML配置,你可以像这样如图所示这里

<batch:job id="conditionalJob">
        <batch:step id="stepOne" next="decision">
            <batch:tasklet ref="stepOneTasklet"></batch:tasklet>
        </batch:step>
        <batch:decision decider="decider" id="decision">
            <batch:next on="Step2" to="stepTwo"/>
            <batch:next on="Step3" to="stepThree"/>
        </batch:decision>
        <batch:step id="stepTwo">
            <batch:tasklet ref="stepTwoTasklet"></batch:tasklet>
        </batch:step>
        <batch:step id="stepThree">
            <batch:tasklet ref="stepThreeTasklet"></batch:tasklet>
        </batch:step>
    </batch:job>

我做的另一个配置

<batch:job id="processorJob">
        <batch:step id="setUpParams">
            <batch:tasklet ref="setUpParamsTasklet"></batch:tasklet>
            <batch:next on="*" to="jobFlowDecider"/>
            <batch:next on="FAILED" to="jobFailed"/>
        </batch:step>

        <batch:decision decider="jobExecutionDecider" id="jobFlowDecider">
            <batch:next on="PROJECT_NOT_EXIST" to="createProject"/>
            <batch:next on="MODEL_NOT_EXIST" to="createModel"/>
            <batch:next on="MODEL_EXIST" to="importModel"/>
        </batch:decision>

        <batch:step id="createProject">
            <batch:tasklet ref="createProjectTasklet"></batch:tasklet>
            <batch:next on="*" to="createModel"/>
            <batch:next on="FAILED" to="jobFailed"/>
        </batch:step>
<batch:step id="updateRevision">
            <batch:tasklet ref="updateRevisonTasklet"></batch:tasklet>
            <batch:end on="COMPLETED"/>
            <batch:next on="FAILED" to="jobFailed"/>        
        </batch:step>
        <batch:step id="jobFailed">
            <batch:tasklet ref="jobFailedTasklet"></batch:tasklet>          
        </batch:step>
    </batch:job>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM