Вопрос проектирования динамических верблюжих маршрутов Apache / контекста - PullRequest
1 голос
/ 14 июня 2011

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

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

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

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

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

У меня есть несколько вопросов:

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

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

1 Ответ

2 голосов
/ 14 июня 2011

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

Тогда вам может понадобиться только один статический маршрут или POJO-потребитель (см. Ниже), который может обрабатывать сообщения об обновлении продукта.использование простого компонента POJO (может помочь привязка компонента и т. д.).Затем боб 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...
    }
}
...