2015-10-06 57 views
0

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

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

在一个例子中,让我们说我有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(); 

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

回答

0

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

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

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

HTH