Как прослушивать события, не потребляя их

#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:

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