ActiveMQ: Как работать с брокером отработки отказа при использовании временных очередей

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

I я столкнулся с той же проблемой на моем конце, что упоминалось в этой теме: http://activemq.2283324.n4.nabble.com/jira-Created-AMQ-3336-Temporary-Destination-errors-on-HA-failover -in-broker-network-with-Failover-tt-td3551034.html # a3612738

Всякий раз, когда я перезапускал произвольный брокер в своей сети, я получал много подобных ошибок в журнале потребительских приложений при попытке отправить ответ на временная очередь:

javax.jms.InvalidDestinationException:
  Cannot publish to a deleted Destination: temp-queue://ID:...

Затем я увидел там ответ Гэри, предлагающий использовать

jms.watchTopicAdvisories=false

в качестве параметра URL-адреса на клиентском brokerURL . Я быстро изменил URL-адреса брокера моего клиента с помощью этого дополнительного параметра. Однако теперь я вижу подобные ошибки, когда перезапускаю свои брокеры в сети для этого тестирования аварийного переключения:

javax.jms.JMSException: 
  The destination temp-queue:
    //ID:client.host-65070-1308610734958-2:1:1 does not exist.

Я использую версию ActiveMQ 5.5. А URL моего брокера клиента выглядит так:

failover:(tcp://amq-host1:61616,tcp://amq-host2.tred.aol.com:61616,tcp://amq-host3:61616,tcp://amq-host4:61616)?jms.useAsyncSend=true&timeout=5000&jms.watchTopicAdvisories=false

Кроме того, вот мой XML-код конфигурации activemq для одного из 4 брокеров: amq1.xml

Кто-нибудь может разобраться в этой проблеме и подсказать, какую ошибку я делаю в этой настройке.

Обновление:

Чтобы уточнить, как я выполняю запрос-ответ в моем коде:

  1. Я уже использую назначение для каждого производителя (то есть временную очередь) и устанавливаю это в заголовке ответа на каждое сообщение.
  2. Я уже отправляю уникальный идентификатор корреляции для каждого сообщения в заголовке JMSCorrelationID.
  3. Насколько мне известно, даже Camel и Spring также используют временную очередь для механизма запроса-ответа. Единственная разница в том, что реализация Spring JMS создает и уничтожает временную очередь для каждого сообщения, тогда как я создаю временную очередь на время существования производителя. Эта временная очередь уничтожается, когда клиент (производитель)завершение работы приложения или брокером AMQ, когда он понимает, что к этой временной очереди не подключен активный производитель.
  4. Я уже устанавливаю срок действия сообщения для каждого сообщения на стороне источника, чтобы сообщение не задерживалось в очереди слишком долго (60 секунд).

52
задан Roman C 16 March 2016 в 04:00
поделиться