spring-batch (java-config) 使用 JobExecutionDecider 识别和执行步骤

Posted

技术标签:

【中文标题】spring-batch (java-config) 使用 JobExecutionDecider 识别和执行步骤【英文标题】:spring-batch (java-config) identifying and executing step using JobExecutionDecider 【发布时间】:2015-12-08 06:22:14 【问题描述】:

我有 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");
        
    ;

在作业配置中,我有以下sn-p,

@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

【问题讨论】:

虽然我不知道 SimpleAsyncTaskExecutor,但我只找到了这些替代品:flows 和 workarounds 【参考方案1】:

我不确定您的代码如何正常工作 - 在我看来 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 已经执行,然后您再次调用决策程序并按照行 - builder.from(decider).on("*").to(c); 再次执行 STEP - C。您还必须注意,这次调用决策者时,final StepExecution stepExecution 参数将是步骤 C 而不是 STEP - B。

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

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

【讨论】:

以上是关于spring-batch (java-config) 使用 JobExecutionDecider 识别和执行步骤的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Java-config 类导入 XML-config 以便两个上下文都有 bean?

spring-batch (ItemProcessor) 数据处理过程

Spring-Batch 没有将元数据持久化到数据库?

Spring-batch:如何在 Spring Batch 中使用 skip 方法捕获异常消息?

Spring-Batch学习总结——重要概念,环境搭建,名词解释,第一个项目及异常处理

如何确保 SFTP 会话始终在 spring-batch 结束时关闭