当前位置: 首页 > 知识库问答 >
问题:

Spring Batch FlowJobBuilder:“JobStep”类型步骤的并行和顺序执行

贾飞鸿
2023-03-14

我有一份由不同的工作组成的工作。我希望在其他作业步骤完成后,一起触发一批这些作业步骤(JobStep1、JobStep2、JobStep3)(在不同的线程中与AsyncTaskExecutor一起运行)和最后一个作业步骤(JobStep4)。因此,我为每个JobStep创建了不同的流,并用AsyncTaskExecutor将它们放在一个流中。我还为最后一个JobStep做了一个单独的流。

完成工作时的工作步骤1工作步骤2工作步骤3工作步骤4

 Flow flowJob1= new FlowBuilder<Flow>(jobStep.getName()).from((JobStep)jobStep1).end(); 

 Flow flowJob2= new FlowBuilder<Flow>(jobStep.getName()).from((JobStep)jobStep2).end(); 

Flow flowJob3= new FlowBuilder<Flow>(jobStep.getName()).from((JobStep)jobStep3).end(); 

Flow flowJob4= new FlowBuilder<Flow>(jobStep.getName()).from((JobStep)jobStep4).end(); 

 Flow splitFlow = new FlowBuilder<Flow>("splitflow").split(new SimpleAsyncTaskExecutor()).add(flowJob1,flowJob2,flowJob3).build(); 
JobFlowBuilder jobFlowBuilder = jobBuilderFactory.get(jobName).repository(jobRepository)
                .start((Flow)splitFlow);

            jobFlowBuilder.next(flowJob4);
        FlowJobBuilder flowJobBuilder= jobFlowBuilder.build();
        Job parentJob = flowJobBuilder.build();
        return parentJob;

问题是:主作业没有等待所有作业步骤(在不同的线程中)完成,然后运行下一个作业步骤。有没有我应该做的spring batch配置来解决这个问题?

共有1个答案

仲孙毅
2023-03-14

您需要将JobStep1-3组合成一个flowStep。然后使用常规的SimpleJobBuilder构建作业。

Flow flowJob1= new FlowBuilder<Flow>(jobStep.getName()).from((JobStep)jobStep1).end(); 

Flow flowJob2= new FlowBuilder<Flow>(jobStep.getName()).from((JobStep)jobStep2).end(); 

Flow flowJob3= new FlowBuilder<Flow>(jobStep.getName()).from((JobStep)jobStep3).end(); 

// Don't need this
// Flow flowJob4= new FlowBuilder<Flow>(jobStep.getName()).from((JobStep)jobStep4).end(); 

Flow splitFlow = new FlowBuilder<Flow>("splitflow").split(new SimpleAsyncTaskExecutor()).add(flowJob1,flowJob2,flowJob3).build();

FlowStep flowStep = new FlowStep(splitFlow);

SimpleJobBuilder jobBuilder = new JobBuilder(yourJobName).start(flowStep);

jobBuilder.next(jobStep4);
 类似资料:
  • 这是我的Spring Batch管理控制台显示的内容的副本: 步名..读..写..提交..回滚..持续时间..状态 step2................................................................................ 谢谢

  • 我扩展了FlowJob类,并将其设置为: 如你所见,我想做的如下: 执行步骤1 当我运行作业时,步骤1和2正确执行,然后作业终止。 知道吗? 编辑:SO Spring批处理流程/步骤后拆分的相关问题。

  • 问题内容: 我整天都在整理此问题,希望有人能帮助您确定我的问题。我已经使用Ajax在我的应用程序中创建了“异步进度回调”类型的功能。当我将功能剥离到测试应用程序中时,我得到了预期的结果。见下图: 所需功能 当我使用相同的代码将功能绑定到我的单页应用程序中时,出现了一种阻塞问题,其中所有请求仅在最后一个任务完成后才得到响应。在测试应用程序中,所有请求均会依次响应。服务器报告所有请求的状态(“待定”)

  • 问题内容: 在我的模型中,具有获取数据的功能,该数据需要完成处理程序作为参数: 它正在调用另一个函数,该函数执行联系人的异步加载,我将完成情况转发到该函数 具有完成的调用如下所示: 有时这是可行的,但是执行的顺序常常不是我期望的那样。问题是,有时下的范围之前执行下结束了。 这是为什么?如何确保在之后开始执行? 问题答案: 一些观察: 它总是执行2之前1处的值。获得描述的行为的唯一方法是,如果要在f

  • 本文向大家介绍setTimeout和Promise的执行顺序?相关面试题,主要包含被问及setTimeout和Promise的执行顺序?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 首先我们来看这样一道题: 输出答案为2 10 3 5 4 1 要先弄清楚settimeout(fun,0)何时执行,promise何时执行,then何时执行 settimeout这种异步操作的回调,只有主线程