Вопрос о разработке динамических маршрутов/контекста верблюдов Apache

У нас есть ActiveMQ, на который публикуются события, происходящие в системе. В проекте участвуют пользователи, добавляющие объекты в свой список наблюдения, и всякий раз, когда в этих объектах происходят события, я хотел бы, чтобы заинтересованным участникам было отправлено электронное письмо.

Вариант использования примерно означает, что кто-то проявляет интерес к странице с информацией о продукте в каталоге и отправляет электронное письмо всякий раз, когда происходит какое-либо действие с этим продуктом (цена снижается, есть положительный отзыв и т. д.). Я смоделировал это взаимодействие как маршрут Camel.

Так, например, если пользователь говорит, что напишите мне, когда рейтинг этого продукта будет равен 5, то в контекст верблюда будет добавлен следующий маршрут:

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

Точно так же, если пользователь хочет получать уведомления всякий раз, когда появляется новый комментарий к продукту, будет создан другой маршрут и так далее. Потенциально это может привести к созданию тысяч маршрутов, поскольку каждый пользователь начинает добавлять свои интересующие часы.

Некоторые вопросы, которые у меня есть:

  • Является ли это приемлемым способом создания динамических маршрутов? Один из вариантов, который я рассматриваю, — использовать списки получателей. Но я не смог придумать решение, которое позволяло бы элегантно перенаправлять сообщения в bean-компонент, который возвращал бы список получателей. Например, для случая, описанного выше, будет ли компонент иметь кучу if-else, чтобы увидеть, какой список получателей вернуть?

  • Верблюжий контекст имеет метод загрузки маршрутов из файла xml, но не имеет метода сохранения существующих маршрутов. Какой самый простой (и эффективный) способ сохранить эти динамически созданные маршруты? Эта ветка в списке пользователей Camel подводит итог моей запрос.


person calvinkrishy    schedule 13.06.2011    source источник


Ответы (1)


Учитывая динамический характер ваших требований к подписке, вам следует использовать базу данных для хранения информации, а не пытаться создавать динамические маршруты. Это гораздо более масштабируемое/соответствующее использование технологии...

Тогда вам может понадобиться только один статический маршрут или потребитель POJO (см. ниже), который может обрабатывать сообщения об обновлении продукта с помощью простого bean-компонента POJO (может помочь bean-binding и т. д.) . Затем компонент POJO будет отвечать за запросы к базе данных, чтобы найти всех «заинтересованных» пользователей и отправить электронное письмо, используя camel- почта

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...
    }
}
person Ben ODay    schedule 14.06.2011
comment
Спасибо. Вы дали мне некоторую информацию и указатели, чтобы пережевать. Ценить это. - person calvinkrishy; 15.06.2011