繁体   English   中英

Spring Batch并行Tasklet

[英]Spring batch parallel Tasklet(s)

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

大多数步骤应按顺序执行。 在一个特定的步骤中,我想启动X *.bat文件,该文件最多可以包含Y个实例。

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

当然,当所有10个执行完成时,下一步应该开始(因此它是一个同步执行)。

问题:

  1. 春季批处理是正确的方法吗? (该步骤是否应使用不同的参数执行10次?)
  2. 还是应该只执行一次该步骤并开发一个“线程控制器”,最多允许5个(或Y个)线程?

如果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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM