2014-01-30 13 views
2

對於Spring TaskExecutor抽象,是否有任何等效的ActiveMQ message groups?這個想法是,當從消息隊列(使用消息組的ActiveMQ)消費消息時,消息處理任務的執行將按順序執行(處理來自消息組的消息的任務在先前處理來自該組的消息的任務尚未完成)。在Spring TaskExecutor中等效的ActiveMQ消息組

一個選項是拋棄TaskExecutor(在我的情況下是一個ThreadPoolTask​​Executor)並使用固定數量的工作線程,每個工作線程都直接從MQ中消耗,但是失去了ThreadPoolTask​​Executor提供的執行靈活性,毫不猶豫地這樣做。

乍一看,在Spring中似乎沒有這樣的功能,但是我拒絕相信我是第一個遇到過這種問題的人,而且這個問題以前還沒有解決。任何見解歡迎:)

+0

Spring集成具有[聚合](http://docs.spring.io/spring-integration/docs/2.0.0.RC1/reference/html/aggregator.html),其聚合相關的消息。我知道,與任務不太一樣。 – flup

+0

其實我並不需要聚合,只是訂購......各種各樣的.. :) – Manjabes

回答

1

簡單的答案 - 沒有沒有。 TaskExecutor只是線程池的一個抽象,所以沒有任何線程間路由的知識。根據你想要控制的事情,你有沒有看過編寫一個簡單的路線Camel來控制消息路由到你的線程?

+0

乍一看,駱駝的選擇似乎至少爲「硬線」作爲我目前的「解決方案」 ...... – Manjabes

1

我不知道任何類似於ActiveMq可以使用彈簧任務執行器

您的要求

「的想法是,從消息隊列消費消息時(一個 ActiveMQ的利用消息組),然後將執行的消息 處理任務的執行(在處理來自該組的消息的前一個任務 還沒有完成之前,處理來自消息組的消息的任務 沒有開始)。「

我的建議:

您指定的要求,可以不必在簡單的Java任何麻煩來執行。

您可以在數據庫中使用一個簡單的表創建一個虛擬隊列,並使用自定義查詢生成在你需要的方式的內容。

當數據存在於數據庫中時,您可以執行所有操作,例如獲取類似數據,重用數據等。一旦實現了這些簡單步驟,您可以在沒有太多開銷的情況下完成使用ActiveMQ執行的所有操作。

  1. 將每個請求插入到數據庫中。
  2. 根據需求獲取數據。
  3. 根據您獲取的數據構建您需要的內容。
  4. 使用任務計劃程序執行您需要執行的操作。
  5. 從數據庫中刪除數據。

我沒有看到任何使用一些自定義代碼的要求麻煩。

希望它有幫助。好運:)

解決方案,不使用數據庫。

1創建你所需要的元素的類文件。如ID,名稱,地址等。

2創建一個靜態的最終的HashMap像這樣用key作爲分組值和arraylistclassName作爲值。

public static final HashMap<Key, List<ClassName>> map= new HashMap<Key, List<ClassName>>(); 

3,如果存在該鍵的條目類現在添加到列表中HashMap。否則用這個新密鑰和一個帶有該類的ArrayList放置一個新的散列值。現在

if(map.containsKey(className.getId())){ 
      map.get(className.getId()).add(className); 
     } 
     else{ 
      List<ClassName> lstClass= new ArrayList<ClassName>(); 
      lstClass.add(className); 
      map.put(className.getId(), lstClass); 
     } 

4爲每個鍵你會得到包含所有關鍵

類這樣會起作用,就像DB類ClassNameArrayList。在這個例子中,你無法基於多個值進行條件判斷。但根據您的要求,任何事情都可以改變。

+0

另一個數據庫的依賴是什麼我怕我買不起。 – Manjabes

+0

同樣的事情可以用靜態hashMap來實現將會很容易,並且不需要另一張表。 – Dileep

+0

自己實現這一切的所有可能的陷阱是我一直試圖避免的事情。我有點希望那樣的事情已經完成了。 – Manjabes