Spring批并行Tasklet(s)

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

大多数步骤应该连续执行 . 在一个特定的步骤中,我想要启动最多可能有Y个实例的X *.bat 文件 .

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

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

问题:

  • 是 Spring 季批量的正确方法吗? (这是一个应该用不同参数执行10次的步骤吗?)

  • 或者我应该只执行一次步骤并开发一个允许5(或Y)个最大线程的"thread-controller"?

如果 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();

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

回答(1)

2 years ago

如果您希望tu设置最大并发,那么您必须使用SimpleAsyncTaskExecutor的setConcurrencyLimit方法 .

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

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

HTH