关于动态Apache驼峰路由/上下文的设计问题

时间:2011-06-13 21:58:55

标签: apache-camel eip

我们有ActiveMQ,系统上发生的事件将发布到ActiveMQ上。该项目涉及用户将实体添加到他们的观察列表中,并且每当有这些实体上的事件时,我希望将电子邮件发送给感兴趣的参与者。

用例大致转化为某人对目录中的产品信息页面表示兴趣,并且当该产品发生任何活动时发送电子邮件(价格下降,有正面评论等)。我把这种互动模仿为骆驼路线。

因此,例如,如果用户在此产品的评级等于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中的这个帖子总结了我的请求。

1 个答案:

答案 0 :(得分:2)

鉴于订阅要求的动态特性,您应该使用数据库来存储信息,而不是尝试创建动态路由。这是一种更具可扩展性/适当的技术使用......

然后,您只需要一个静态路由或POJO consumer(见下文),它可以使用简单的POJO bean处理产品更新消息(bean-binding可以提供帮助等)。然后,POJO bean将负责查询数据库以查找所有“感兴趣的”用户并使用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...
    }
}