从嵌套作业过渡到 "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条路径。
- 前进
- 后退
这些路径的选择取决于一些动态布尔条件。让我们说,首先,该步骤的所有退出代码都被评估为 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"/>
我的处理方式如下:
- 为 nested_job 创建一个
JobExecutionListener
,在作业结束时将作业的 ExitStatus 设置为 'BACKWARD' 或 'FORWARD'。
- 创建一个
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
我有 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条路径。
- 前进
- 后退
这些路径的选择取决于一些动态布尔条件。让我们说,首先,该步骤的所有退出代码都被评估为 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"/>
我的处理方式如下:
- 为 nested_job 创建一个
JobExecutionListener
,在作业结束时将作业的 ExitStatus 设置为 'BACKWARD' 或 'FORWARD'。 - 创建一个
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