[英]Spring batch parallel Tasklet(s)
我目前正在构建一个执行多个步骤的Spring Batch应用程序。 除了一个步骤外,所有步骤都是简单的小任务(没有读写程序),它们负责各种任务,例如复制文件,发送请求,启动批处理(* .bat)文件等。
大多数步骤应按顺序执行。 在一个特定的步骤中,我想启动X *.bat
文件,该文件最多可以包含Y个实例。
在一个示例中,假设我有10个*.bat
文件,但我希望最多运行5个并行文件。 因此,前5个一起开始,当其中一个完成时,下一个(第6个)应该开始,直到处理完所有10个。
当然,当所有10个执行完成时,下一步应该开始(因此它是一个同步执行)。
问题:
如果1 == true
:)我想我必须与taskExecutor一起工作,下面有一个例子,我从第一步开始(让我说必须找出X是多少),之后我有一个flowParallel(简而言之,如果有更多的批处理,请重新开始该步骤),然后我进行了拆分以允许并行执行(目前只有3个步骤,当然我可以添加所有X,并添加一个受“ taskExecutor”限制的循环)。 setMaxPoolSize“,我觉得很愚蠢)
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();
所以,我做错了什么? 我应该走哪条路?
如果要设置最大并发性,则必须使用SimpleAsyncTaskExecutor的setConcurrencyLimit方法。
如果要并行运行多个步骤,则需要实例化每个步骤的唯一步骤和唯一流程。 在上面的示例中,您在流的同一实例(flowParallel)中并行启动步骤的同一实例(stepS1Parallel)。 这意味着,同一步骤的实例将被多个线程调用,这肯定会搞砸事情。
因此,您需要有一个循环,在其中为要处理的每个* .bat文件创建一个步骤实例以及一个流程实例。
高温超导
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.