Вопрос проектирования динамических верблюжих маршрутов 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...
}
}