从嵌套作业转换为“主要作业”

时间:2015-02-19 14:18:18

标签: spring spring-batch

我有两份工作xmls

1.Main_job.xml

<batch:job id="main_job">
      <batch:step id="dummyTask1">
        <batch:tasklet ref="dummyTask" />
        <batch:next on="FORWARD" to="dummyTask2"/>
      </batch:step>
      <batch:step id="dummyTask2">
        <batch:job ref="nested_job" />  <!--Forking a nested job -->
        <batch:next on="BACKWARD" to="dummyTask1"/>
        <batch:next on="FORWARD" to="dummyTask3"/>
      </batch:step>
      <batch:step id="dummyTask3">
        <batch:tasklet ref="dummyTask" />
        <batch:next on="BACKWARD" to="dummyTask2"/>
        <batch:next on="FORWARD" to="endTask"/>
      </batch:step>
      <batch:step id="endTask">
        <batch:tasklet ref="endTask" />
      </batch:step>
</batch:job>

2.nested_job.xml

<batch:job id="nested_job">
      <batch:step id="dummyTask10">
        <batch:tasklet ref="dummyTask" />
        <batch:next on="FORWARD" to="dummyTask11"/>
      </batch:step>
      <batch:step id="dummyTask11">
        <batch:tasklet ref="dummyTask" />
        <batch:next on="BACKWARD" to="dummyTask10"/>
        <batch:next on="FORWARD" to="dummyTask12"/>
      </batch:step>
      <batch:step id="dummyTask12">
        <batch:tasklet ref="dummyTask" />
        <batch:next on="BACKWARD" to="dummyTask11"/>
        <batch:next on="FORWARD" to="endTask"/>
      </batch:step>
      <batch:step id="endTask">
        <batch:tasklet ref="endTask" />
      </batch:step>
</batch:job>

您可以看到,所有步骤都有2条路径。

  1. FORWARD
  2. BACKWARD
  3. 根据一些动态布尔条件选择这些路径。让我们说,首先,步骤的所有退出代码都会被评估为FORWARD。所以这些是执行的步骤序列

    1. dummyTask1
    2. dummyTask2
     [Nested_job] 3.dummyTask10
     [Nested_job] 4.dummyTask11
     [Nested_job] 5.dummyTask12
    

    让我们说当执行点在dummyTask12时,退出代码开始被评估为BACKWARD。以下是相同

    的步骤执行
    [Nested_job] 5.dummyTask12
    [Nested_job] 4.dummyTask11
    [Nested_job] 5.dummyTask10
    

    现在对于dummyTask10,当退出代码为BACKWARD时,SpringBatch会抛出错误,指出流不存在,这是真的(dummyTask10没有为代码BACKWARDS定义流程。我想要实现的是,如果BACKWARD,流程应该返回main_job 或任何已触发此嵌套作业的主要作业(动态)

    这可能吗?是否有可能有这样的流定义,它将执行点转移到主作业,该作业分叉这个嵌套作业?

    <batch:next on="BACKWARD" to="#{mainJob}"/> <!-- Or something -->
    

    [我知道这有点要求,但我相信SpringBatch专家会找到实现这个目标的方法]

    如果您需要更清晰,请告诉我。

    修改

    从嵌套作业(nested_job)中,我可以在一个步骤中编写如下所示的流程,这将转换为主作业吗?

    <batch:next on="BACKWARD" to="main_job.dummyTask1"/>
    

1 个答案:

答案 0 :(得分:1)

我接近这个的方式如下:

  1. 为nested_job创建一个JobExecutionListener,将作业的ExitStatus设置为在作业结束时为“后退”或“前进”。
  2. 创建StepExecutionListener以从nested_job获取ExitStatus并将其作为main_job.dummyTask2的ExitStatus返回。
  3. 上述流程将允许嵌套作业的结果指示父作业应该去的位置。

    您可以在此处的文档中详细了解StepExecutionListenerhttp://docs.spring.io/spring-batch/apidocs/org/springframework/batch/core/StepExecutionListener.html
    您可以在此处的文档中详细了解JobExecutionListenerhttp://docs.spring.io/spring-batch/apidocs/org/springframework/batch/core/JobExecutionListener.html