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

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

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

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

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

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

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

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

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

1 ответ

Решение

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

Тогда вам может понадобиться только один статический маршрут или потребитель 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...
    }
}
Другие вопросы по тегам