Java Spring批处理并行微线程

Java Spring批处理并行微线程,java,spring,parallel-processing,spring-batch,Java,Spring,Parallel Processing,Spring Batch,我目前正在构建一个spring批处理应用程序,其中执行了几个步骤。除了一个步骤外,所有步骤都是简单的Tasklet(没有读写器),它们负责各种任务,如复制文件、发送请求、启动批处理(*.bat)文件等 大多数步骤都应该串行执行。在一个特定步骤中,我想启动X*.bat文件,该文件最多可以有Y个实例 在一个例子中,假设我有10个*.bat文件,但我希望最多有5个并行运行。所以前5个一起开始,当其中一个完成时,下一个(第6个)应该开始,直到所有10个都处理完毕 当然,当全部10的执行完成时,下一步应该

我目前正在构建一个spring批处理应用程序,其中执行了几个步骤。除了一个步骤外,所有步骤都是简单的Tasklet(没有读写器),它们负责各种任务,如复制文件、发送请求、启动批处理(*.bat)文件等

大多数步骤都应该串行执行。在一个特定步骤中,我想启动X
*.bat
文件,该文件最多可以有Y个实例

在一个例子中,假设我有10个
*.bat
文件,但我希望最多有5个并行运行。所以前5个一起开始,当其中一个完成时,下一个(第6个)应该开始,直到所有10个都处理完毕

当然,当全部10的执行完成时,下一步应该开始(因此是同步执行)

问题是:

  • spring batch是正确的方法吗?(这是一个应使用不同参数执行10次的步骤吗?)
  • 或者我应该只执行一次步骤并开发一个“线程控制器”,允许最多5个(或Y个)线程
  • 如果
    1==true
    :)我想我必须与taskExecutor一起工作,下面我有一个示例,在这里我开始第一步(假设必须找出X的数量),然后我有一个flowParallel(简单地说,如果有更多批,再次开始该步骤),然后我进行拆分以允许并行执行(目前只有3个步骤,我当然可以用一个循环添加所有X,该循环受“taskExecutor.setMaxPoolSize”的限制,我觉得这很愚蠢)

    Flow flowInit=新的FlowBuilder(“flowInit”)
    .from(步骤1)
    .end();
    Flow flowParallel=新的FlowBuilder(“flowParallel”)
    .启动(步骤1并行)
    .下一个(决定一)
    .on(“有更多批处理执行”)
    .至(步骤1平行)。结束();
    最终流量拆分流量=新流量生成器(“拆分流量”)
    .启动(平行流动)
    .split(新的SimpleAsyncTaskExecutor())
    .add(flowParallel,flowParallel,flowParallel)
    .build();
    return jobs.get(“dataLoadParallel”)
    .start(flowInit)
    .下一步(分流)
    .下一步(步骤1)
    .end().build();
    

    那么,我做错了什么?我应该走哪条路?

    如果您想设置最大并发性,那么您必须使用SimpleAsyncTaskExecutor的setConcurrencyLit方法

    如果希望多个步骤并行运行,则需要为每个步骤实例化唯一的步骤和唯一的流。在上面的示例中,在流的同一实例(flowParallel)内启动步骤的同一实例(stepS1Parallel)这意味着,一个步骤的同一个实例被多个线程调用,这肯定会把事情搞砸

    因此,您需要有一个循环,在该循环中,您为每个要处理的*.bat文件创建一个步骤实例和一个流实例

    Flow flowInit = new  FlowBuilder<Flow>("flowInit")
                .from(stepS1)
                .end();
    
    
        Flow flowParallel = new  FlowBuilder<Flow>("flowParallel")
                .start(stepS1Parallel)
                .next(deciderOne)
                .on("thereAreMoreBatchesToExecute")
                .to(stepS1Parallel).end();
    
    
        final Flow splitFlow = new FlowBuilder<Flow>("splitFlow")
                        .start(flowParallel)
                        .split(new SimpleAsyncTaskExecutor())
                        .add(flowParallel, flowParallel, flowParallel)
                        .build();
    
        return jobs.get("dataLoadParallel")
                .start(flowInit)
                .next(splitFlow)
                .next(stepS1)
                .end().build();