以java-config方式控制Spring-Batch步骤流

时间:2014-02-17 21:04:05

标签: spring spring-batch spring-java-config

根据Spring-Batch文档(http://docs.spring.io/spring-batch/2.2.x/reference/html/configureStep.html#controllingStepFlow),控制xml配置文件中的步骤非常简单:

e.g。我可以编写以下作业配置:

<job id="myJob">
    <step id="step1">
        <fail on="CUSTOM_EXIT_STATUS"/>
        <next on="*" to="step2"/>
    </step>

    <step id="step2">
        <end on="1ST_EXIT_STATUS"/>
        <next on="2ND_EXIT_STATUS" to="step10"/>
        <next on="*" to="step20"/>
    </step>

    <step id="step10" next="step11" />
    <step id="step11" />

    <step id="step20" next="step21" />
    <step id="step21" next="step22" />
    <step id="step22" />
</job>

是否有一种以java-config方式定义此类作业配置的简单方法? (使用JobBuilderFactory等等......)

2 个答案:

答案 0 :(得分:3)

正如文档中提到的那样,我们只能根据步骤的退出状态来分支流。为了能够报告自定义退出状态(可能与从批处理状态自动映射的退出状态不同),我们必须为id year name order parent1 2001 bas 1 parent1 2002 jack 2 parent2 1991 david 1 parent3 1993 daniel 1 parent3 1993 jasper 1 parent3 1994 melany 2 parent4 1997 john 3 parent4 1999 gerard 1 提供afterStep方法。

假设我们有一个初始步骤StepExecutionListenerstep1Tasklet的一个实例),我们想要执行以下操作:

  • 如果Step1失败(例如通过抛出运行时异常),那么整个作业应被视为step1
  • 如果FAILEDstep1的退出状态完成,那么我们想要分支到某个步骤COMPLETED-WITH-A,该步骤可能会处理此特定情况。
  • 否则,我们会留在工作的主卡车上并继续执行步骤step2a

现在,在step2类中提供afterStep方法(同时实施Step1):

StepExecutionListener

最后,在private static class Step1 implements Tasklet, StepExecutionListener { @Override public ExitStatus afterStep(StepExecution stepExecution) { logger.info("*after-step1* step-execution={}", stepExecution.toString()); // Report a different exit-status on a random manner (just a demo!). // Some of these exit statuses (COMPLETED-WITH-A) are Step1-specific // and are used to base a conditional flow on them. ExitStatus exitStatus = stepExecution.getExitStatus(); if (!"FAILED".equals(exitStatus.getExitCode())) { double r = Math.random(); if (r < 0.50) exitStatus = null; // i.e. COMPLETED else exitStatus = new ExitStatus( "COMPLETED-WITH-A", "Completed with some special condition A"); } logger.info("*after-step1* reporting exit-status of {}", exitStatus); return exitStatus; } // .... other methods of Step1 } 实现的createJob方法中构建作业流程:

JobFactory

答案 1 :(得分:1)

也许。如果您的意图是“以编程方式”编写类似于流程决策程序的东西(使用SB的框架接口,我的意思是)有内置的实现,并且足以满足大多数用例。

与XML配置相反,如果您熟悉它们,可以使用JavaConfig注释;我个人更喜欢XML定义,但这只是个人观点。