我有 3 个步骤 A、B、C,应按 A->B->C 的顺序执行,其中 B 是可选的。我必须仅根据某些条件执行步骤 B。我使用 JobExecutionDecider 来决定如下:
@Bean(name = "decider")
JobExecutionDecider isStepRequired {
return new JobExecutionDecider() {
@Override
public FlowExecutionStatus decide(final JobExecution jobExecution, final StepExecution stepExecution) {
if (condition not satisfied) {
// return status to skip step B and go to step C
return FlowExecutionStatus.COMPLETED;
}
// return status to proceed with step B
return new FlowExecutionStatus("CONTINUE");
}
};
}
在作业配置中,我有以下代码片段,
@Bean
Job constructJob(final JobBuilderFactory jobs, final Step a, final Step b, final JobExecutionDecider decider, final Step c) {
final JobBuilder jobBuilder = jobs.get("Job");
final JobFlowBuilder builder = jobBuilder.flow(a);
builder.from(a).next(decider);
builder.from(decider).on("CONTINUE").to(b).next(c);
builder.from(decider).on("*").to(c);
return builder.build().build();
上面提到的代码正在按我的预期工作。但我不确定这是否是正确的做法。基本上我期待一种不重复步骤 C 执行的方法。
我确实遇到过 SimpleAsyncTaskExecutor,但我知道它用于我们需要进行并行处理的场景,在我的情况下,如果条件满足,我只需要执行一个步骤。
我的问题是
1.使用SimpleAsyncTaskExecutor可以达到我想要的效果吗?有没有使用注释使用 SimpleAsyncTaskExecutor 的示例?
2.还有其他更好的方法可以避免上述重复吗?
非常感谢任何帮助!
提前致谢,
迪内什·库马尔·P
我不确定你的代码如何正常工作 - 在我看来builder.from(decider).on("*").to(c);
将为步骤 C 创建重复的执行。
STEP - A 完成执行后(无论状态如何),调用决策程序,如果决策程序返回CONTINUE
- 您执行STEP-B,然后执行STEP-C。如果那个决策者没有返回CONTINUE
, STEP-C 仍然被执行,因为它在 - 行中没有条件builder.from(decider).on("CONTINUE").to(b).next(c);
因此 STEP - C 已经执行,然后您再次调用决策程序并按照行再次执行 STEP - C -builder.from(decider).on("*").to(c);
。你还必须注意到final StepExecution stepExecution
这次调用决策程序时,参数将是步骤 C,而不是步骤 - B。
如果我误解了什么,请告诉我。
Also - SimpleAsyncTaskExecutor
并不是为了建立工作流程。其目的是当您尝试并行执行块或尝试并行执行分区步骤时,在您的作业中引入多线程/并行处理。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)