2013-07-06 23 views
2

我有一個彈簧集成工作流,它將任務執行程序嵌入到其通道中,以啓用併發處理。我通過網關手動啓動處理,並需要阻止主線程,直到所有異步進程完成。有沒有辦法做到這一點?我試圖按照障礙,鎖存器和通道攔截器的思路進行思考,但是沒有解決方案即將出現。任何想法的人?Spring集成併發性 - 檢測完成

回答

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

如果聚合器的下游從網關,網關呼叫者可以阻止(或使用的未來,如果這是定義爲在返回類型網關接口),直到聚合器收到並釋放相關的消息組,即使這些消息是在不同的線程上異步處理。

實質上,聚合器本身就是一個屏障,其默認釋放策略本質上是一個基於消息組的序列大小的倒數鎖存器。

希望有所幫助。 馬克

+0

嗨馬克,非常感謝。但是,我不在工作流中使用聚合器。我使用分離器,但僅用於批量輸入(即從150,000個元素的集合中,我創建100個元素的批次)。我想到的一個解決方案是擴展ThreadPoolTask​​Executor,並創建一個鎖定線程租用和掛起的批次 - 當它們都歸零時,然後打開閂鎖。不知道這是否可行,以及它是否像一個優雅的解決方案一樣最好。 –