2014-02-27 67 views
2

我有一個有大量活動(大約40個)的系統。每個活動都可以調用服務或執行一些計算。這個系統是用Java編寫的。目前所有這些活動都是按順序執行的,整個過程大約需要2 - 3秒。我正在嘗試優化系統並嘗試減少延遲。我注意到一些活動具有數據依賴性,其中一些是獨立的。我試圖讓這些活動並行運行,同時還要維護具有數據依賴性的活動的順序。例如,假設通過「F」正被以此順序順序地執行活動「A」:Java中的異步開源工作流程軟件

A->B->C->D->E->F (Activities) 
1 2 3 4 5 6 (Time Units) 

假設由A產生的數據被用於由E和由B中產生的數據被用於由F和其餘的活動不依賴於任何其他數據。而不是按順序運行這些活動中,我應該能夠在這個順序平行運行它們 -

A->E 
B->F 
C 
D 
1 2 (Time) 

因此,而不是6個時間單位,系統應能完成整個過程在2個時間單元。有沒有開源的Java框架可以用來處理這樣的工作流,並且一旦數據可用就可以無縫執行活動?

回答

-1

答案取決於依賴關係圖的拓撲結構。如果它可以用獨立的線性序列分割,就像在你的例子中那樣,然後簡單地將每個序列表示爲一個Runnable,並用它自己的線程運行它們或將它們提交給線程池。

如果一個序列分支這樣的:

A->B->C 
    | 
    ->D->E 

然後先運行序列ABC,並從活動B.運​​行DE

最複雜的情​​況是,當一個活動依賴於兩個或更多的活動:

A->B -> | 
C -> |->D // needs both results from B and C 

您需要圖中的一個節點來收集結果並在收集所有結果時開始新的序列。如果使用線程,則可以將每個依賴表示爲阻塞隊列,並使用BlockingQueue.take()方法從所有輸入隊列首先讀取相關活動。如果你使用一個線程池,那麼您可以:

  • 使用Java8 CompletableFuture類及其方法runAfterBoth(2依賴性)或allOf(依賴項的任意數字)。

  • 使用的一些數據流庫(作爲作者,我建議https://github.com/rfqu/df4j

  • 實現自己加入的節點,這不是什麼大不了的事

+0

在我看來的所有者,這是難以維持。工作流引擎應該是風格上的聲明而不是命令式的。 –

0

這裏是框架正是爲了這個目的(被稱爲Dexecutor),您可以參考thisthis本用例的Dzone文章。對於像用例這樣的工作流程,請參閱this

下面介紹如何使用Dexecutor。

DexecutorConfig<String, String> config = new DexecutorConfig<>(executorService, new TaskProvider()); 
DefaultDexecutor<String, String> executor = new DefaultDexecutor<String, String>(config); 

executor.addDependency("A", "E"); 
executor.addDependency("B", "F"); 
executor.addIndependent("C"); 
executor.addIndependent("D"); 

executor.execute(ExecutionConfig.NON_TERMINATING); 

免責聲明:我是這個框架