[英]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.