3

我有 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.有没有其他更好的方法可以避免上述重复?

非常感谢任何帮助!

在此先感谢 Dhinesh Kumar P

4

1 回答 1

0

我不确定您的代码如何正常工作 - 因为在我看来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 而不是 STEP - B。

如果我误解了什么,请告诉我。

此外 -SimpleAsyncTaskExecutor并不意味着建立工作流程。其目的是在您尝试并行执行块或尝试并行执行分区步骤时在您的工作中引入多线程/并行处理。

于 2017-08-24T05:00:56.453 回答