从嵌套作业过渡到 "main job"

Transition from nested job to "main job"

我有 2 个工作 xml

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. 前进
  2. 后退

这些路径的选择取决于一些动态布尔条件。让我们说,首先,该步骤的所有退出代码都被评估为 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. 为 nested_job 创建一个 JobExecutionListener,在作业结束时将作业的 ExitStatus 设置为 'BACKWARD' 或 'FORWARD'。
  2. 创建一个 StepExecutionListener 以从 nested_job 和 return 中获取 ExitStatus 作为 main_job.dummyTask2 的 ExitStatus.

以上流程将允许嵌套作业的结果指示父作业的去向。

您可以在此处的文档中阅读有关 StepExecutionListener 的更多信息:http://docs.spring.io/spring-batch/apidocs/org/springframework/batch/core/StepExecutionListener.html
您可以在此处的文档中阅读有关 JobExecutionListener 的更多信息:http://docs.spring.io/spring-batch/apidocs/org/springframework/batch/core/JobExecutionListener.html