2013-02-06 34 views
1

我有以下情形:ActiveMQ的 - 工作線程和任務的池

  • 一些操作被調用,因此多個任務創建(千)
  • 他們(他們的身份和詳細信息)都存儲在數據庫表
  • 我需要在多個節點上

莫名其妙地執行這些任務,這樣,很明顯的方法是發送對每一所創建的任務JMS消息(10000個任務 - 10000個消息)和池(每個節點)的消費者會執行它們 - 但是這看起來像是矯枉過正 - 無論如何,監聽者需要從數據庫中獲取任務,只要通知它它應該工作下一個任務,就好像 - 發送一條消息( 「工作下一個任務」),並以某種方式將其設置爲交付10000次。

如何解決這個問題?發送10000條消息真的是最好的主意嗎?另外,ActiveMQ有這個消息調度的事情[1] - 也許只是將週期設置爲0,並重復到10000?這會正常工作嗎?有沒有比上面提到的更好的方法?

[1] http://activemq.apache.org/delay-and-schedule-message-delivery.html

回答

0

其實,你可以使用Redis的存儲已完成任務(1..1)的ID。並使用「設置」數據結構。

鍵會看起來像任務列表:

每個鍵將包含已完成任務的ID。

所以,當你開始1000個異步任務的工作。您爲此作業生成一些唯一的ID,並使用任務ID發送,當任務完成後,worker(處理此任務的人)應在DB(Redis)中添加此ID。當最後一名工人將數據保存在數據庫中並且設置的大小與任務的大小相同時(您應該在每項任務之後檢查它) - 完成所有任務,以便您可以發送另一條消息或進行其他任何操作。

Redis提供非常快速的訪問和非常快速的少數數據結構。