#java #activemq
#java #activemq
Вопрос:
Я работаю над симулятором на Java, который использует ActiveMQ для связи между различными частями, которые будут работать на разных машинах. У меня все в основном запущено и запущено, но клиент попросил, чтобы одна из служб регистрировала все проходящие события. Загвоздка в том, что, насколько я понимаю, в режиме очереди (настройка по умолчанию в коде, над которым я работаю) после прочтения событие используется. Есть ли способ «подсмотреть» событие, не потребляя его? Я подумывал о том, чтобы прочитать его, а затем повторно занести в журнал, но мне кажется, что для этого потребуется дополнительный уровень проверки, чтобы убедиться, что служба ведения журнала не перехватит его снова.
Комментарии:
1. Я предлагаю вам добавить еще один тег, такой как lang concerned
2. Спасибо. Я не думал этого делать.
3. Какую версию ActiveMQ вы используете?
Ответ №1:
Если вы используете Java и поскольку вы используете очередь, то вы можете использовать JMS QueueBrowser
. Это позволит вам проверять сообщения в очереди, фактически не используя их.
Вы также можете рассмотреть возможность использования зеркальной очереди, поскольку она была разработана с учетом такого варианта использования.
Ответ №2:
Учтите, что в вашем проекте у вас может быть более одного подписчика на поток событий — приложение, потребляющее сообщения, и служба ведения журнала, которая должна отслеживать информацию. Позволяя службе ведения журнала получать свои собственные копии сообщений, и они могут сохранять или отбрасывать по мере необходимости
Проверьте шаблон виртуальной темы — отправьте сообщение в тему и прочитайте из очереди. С помощью этого дизайна вы можете в любое время добавлять дополнительных подписчиков и предоставлять службе ведения журнала их собственную копию сообщений.
Редактировать:
Кроме того, вы можете настроить составное назначение для отправки копии сообщений во вторую очередь.
<destinationInterceptors>
<virtualDestinationInterceptor>
<virtualDestinations>
<compositeQueue name="APP.DATA.IN" forwardOnly="false">
<forwardTo>
<queue physicalName="APP.DATA.IN.LOGGING.SERVICE" />
</forwardTo>
</compositeQueue>
</virtualDestinations>
</virtualDestinationInterceptor>
Это нужно будет добавить вручную для каждой очереди, которую вы хотите получить во второй копии. При использовании подхода виртуальной темы вам не нужно добавлять конфигурацию для каждого.
Ответ №3:
В конечном счете, я закончил настройку темы с издателями и перечисленными подписчиками из-за простоты определения, какие службы будут получать какие темы, и текущей настройки, в которой сообщения потребляются почти так же быстро, как они могут быть созданы. Все, что мне нужно было сделать, это заставить модуль ведения журнала подписаться на все определенные сообщения, а также на любые другие модули, которые будут их получать.