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