Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring batch spring批处理(java配置)使用JobExecutionDecider识别和执行步骤_Spring Batch_Multi Step - Fatal编程技术网

Spring batch spring批处理(java配置)使用JobExecutionDecider识别和执行步骤

Spring batch spring批处理(java配置)使用JobExecutionDecider识别和执行步骤,spring-batch,multi-step,Spring Batch,Multi Step,我有3个步骤A、B、C,它们应该按照顺序A->B->C执行,其中B是可选的。我只能根据某些条件执行步骤B。我使用JobExecutionDecider做出如下决定: @Bean(name = "decider") JobExecutionDecider isStepRequired { return new JobExecutionDecider() { @Override public FlowExecutionStatus decide(final J

我有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执行的方法

我确实遇到过SimpleAsynctaskeExecutor,但我知道它用于需要进行并行处理的场景,在我的情况下,如果条件满足,我只需要执行一个步骤

我的问题是 1.我可以通过使用SimpleAsyncTaskExecutor实现我想要的吗?是否有使用SimpleAsynctaskeExecutor或使用注释的示例? 2.有没有其他更好的方法可以避免上述重复

非常感谢您的帮助

提前感谢,,
Dhinesh Kumar P

我不确定您的代码是如何正确工作的-在我看来

builder.from(decider).on(“*”)to(c)将为步骤C创建重复执行

在步骤-A完成执行后(无论处于何种状态),将调用decider,如果decider返回
CONTINUE
,则执行步骤-B,然后执行步骤-C。如果决策器没有返回
CONTINUE
,那么步骤-C仍然会执行,因为在第-
builder.from(决策器).on(“CONTINUE”).to(b.next(C)行中这不是有条件的

所以步骤-C已经执行了,然后您再次调用decider,并按照第-
builder.from(decider).on(“*”)到(C)行再次执行步骤-C。您还必须注意,当这次调用decider时,
final StepExecution StepExecution
参数将是步骤C,而不是步骤B

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


另外-
SimpleAsynctaskeExecutor
并不用于构建作业流。它的目的是在您尝试并行执行块或并行执行分区步骤时,在作业中引入多线程/并行处理

虽然我不知道SimpleAsyncTaskExecutor,但我只找到了以下替代方案:和