簡體   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