2011-06-13 29 views
1

我們擁有發佈系統中發生的事件的ActiveMQ。該項目涉及用戶將實體添加到他們的監視列表中,並且每當發生這些實體上的事件時,我希望將電子郵件發送給感興趣的參與者。關於動態Apache駱駝路由/上下文的設計問題

用例粗略地翻譯爲某個人在目錄上的產品信息頁面上表達興趣,並且每當該產品發生任何活動時都會發送一封電子郵件(價格下降,存在積極評論等) 。我將這種交互模擬爲駱駝路線。

因此,舉例來說,如果用戶說,每當這個產品的評級等於5發郵件給我,那麼下面的路線將被添加到駱駝背景:

from("activemq:topic:events.product.save").filter().xpath("/object[<object id>]/rating").isEqualTo("5").to("email:<user's email>") 

同樣,如果用戶希望得到通知時對產品有新的評論,會創建另一條路線等等。這可能最終會在每個用戶開始添加感興趣的手錶時創建數千條路線。

,我有一些問題是:

  • 這是創建動態路由的一種可接受的方式?我正在考慮的一個選擇是使用收件人列表。但是我還沒有能夠想出一個解決方案,將消息路由到返回收件人列表的bean。例如對於上面解釋的情況,bean是否有一堆if-else來查看要返回哪個收件人列表?

  • camelcontext有一個方法來從XML文件加載路由,但沒有方法來堅持現有的路由。什麼是最簡單(和有效)的方式來堅持這些動態創建的路線? camel-users list中的此線程總結了我的請求。

回答

2

鑑於訂閱需求的動態特性,您應該使用數據庫來存儲信息,而不是嘗試創建動態路由。這是一個更具擴展性/恰當地使用技術的...

然後你就可以只需要一個靜態路由或一個POJO consumer(見下文),可以使用一個簡單的POJO豆加工的產品更新消息(bean-binding可以幫助等)。然後,POJO豆將負責查詢數據庫中查找所有「感興趣」的用戶和發送使用camel-mail

public class NotificationBean { 

    @Consume(uri="activemq:topic:events.product.save") 
    public void onUpdate(@XPath("/object/id") String id, 
         @XPath("/object/rating") String rating) { 
     //query database for subscriptions for this product ID/rating, etc. 
     //for each interested subscriber 
      //send email (camel-mail, etc) 
    } 

    public void addSubscription(String productID, Integer rating, String email) { 
     //create/update subscription entry in database, etc... 
    } 
} 
+0

感謝郵件。你給了我一些信息和指示來咀嚼。欣賞它。 – calvinkrishy 2011-06-15 01:44:16