我有一個彈簧集成工作流,它將任務執行程序嵌入到其通道中,以啓用併發處理。我通過網關手動啓動處理,並需要阻止主線程,直到所有異步進程完成。有沒有辦法做到這一點?我試圖按照障礙,鎖存器和通道攔截器的思路進行思考,但是沒有解決方案即將出現。任何想法的人?Spring集成併發性 - 檢測完成
2
A
回答
0
要回答我的問題,這是我落得這樣做:
- 創建一個自定義的ExecutorService它知道何時關閉 - 在我的情況,這是簡單地釋放最後一個活動線程時 - 即在工作流執行的最後一塊後:
public class WorkflowThreadPoolExecutor extends ScheduledThreadPoolExecutor {
public WorkflowThreadPoolExecutor(int corePoolSize) {
super(corePoolSize);
}
@Override
protected void afterExecute(Runnable r, Throwable t) {
super.afterExecute(r, t);
if (getActiveCount() == 1) {
shutdown();
}
}
}
- 等待或在主線程執行終止如follws:
try {
executorService.awaitTermination(Integer.MAX_VALUE, TimeUnit.SECONDS);
} catch (InterruptedException ex) {
LOG.error("message=Error awaiting termination of executor", ex);
}
希望這可以幫助其他人面臨着類似的問題。
2
看一看從參考手冊的聚合部分: http://static.springsource.org/spring-integration/docs/latest-ga/reference/htmlsingle/#aggregator
如果聚合器的下游從網關,網關呼叫者可以阻止(或使用的未來,如果這是定義爲在返回類型網關接口),直到聚合器收到並釋放相關的消息組,即使這些消息是在不同的線程上異步處理。
實質上,聚合器本身就是一個屏障,其默認釋放策略本質上是一個基於消息組的序列大小的倒數鎖存器。
希望有所幫助。 馬克
相關問題
- 1. Spring集成併發JMS適配器
- 2. Spring MVC + Tiles:集成測試
- 3. Spring @PathVariable集成測試
- 4. 測試RabbitMQ和Spring集成
- 5. Spock&Spring Boot集成測試
- 6. Spring oauth2和集成測試
- 7. 檢測jQuery觸發完成時
- 8. 可行性Spring集成
- 9. Docker組合和併發集成測試
- 10. 將Spring MVC與Spring集成集成
- 11. 可可animationImages完成檢測
- 12. 檢測getView()調用完成。
- 13. 檢測時ValueAnimator完成
- 14. 檢測Ajax是否完成
- 15. 檢測FileStreamResult何時完成
- 16. presentModalViewController檢測動畫完成
- 17. 檢測動畫的完成
- 18. 檢測WebView加載完成
- 19. 檢測自動完成
- 20. Spring集成:多個應用程序集成使用Spring集成
- 21. Spring集成測試:無法檢測默認資源位置
- 22. MongoDB + Spring集成
- 23. Spring集成流
- 24. Spring Swing集成
- 25. Spring ldap集成
- 26. WebDAV/Spring集成?
- 27. Spring Hibernate集成
- 28. Spring集成
- 29. Android Spring集成
- 30. Spring集成 - 隔
嗨馬克,非常感謝。但是,我不在工作流中使用聚合器。我使用分離器,但僅用於批量輸入(即從150,000個元素的集合中,我創建100個元素的批次)。我想到的一個解決方案是擴展ThreadPoolTaskExecutor,並創建一個鎖定線程租用和掛起的批次 - 當它們都歸零時,然後打開閂鎖。不知道這是否可行,以及它是否像一個優雅的解決方案一樣最好。 –