我有两份工作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条路径。
根据一些动态布尔条件选择这些路径。让我们说,首先,步骤的所有退出代码都会被评估为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"/>
答案 0 :(得分:1)
我接近这个的方式如下:
JobExecutionListener
,将作业的ExitStatus设置为在作业结束时为“后退”或“前进”。StepExecutionListener
以从nested_job获取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