В моих приложениях JMS мы используем временные очереди в Producers, чтобы иметь возможность получать ответы от пользовательских приложений.
Я сталкиваюсь с той же проблемой на моем конце, как упомянуто в этой теме: http://activemq.2283324.n4.nabble.com/jira-Created-AMQ-3336-Temporary-Destination-errors-on-H-A-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
Кроме того, вот мой configm activemq для одного из 4 брокеров:
amq1.xml
Может кто-то здесь, пожалуйста, посмотрите на эту проблему и предложите мне, какую ошибку я делаю в этой настройке.
Обновление:
Чтобы уточнить, как я делаю запрос-ответ в моем коде:
- Я уже использую назначение для каждого производителя (то есть временную очередь) и задаю его в заголовке для каждого сообщения.
- Я уже отправляю уникальный идентификатор корреляции для каждого сообщения в заголовке JMSCorrelationID.
- Насколько я знаю, даже Camel и Spring также используют временную очередь для механизма запроса-ответа. Единственное отличие состоит в том, что реализация Spring JMS создает и уничтожает временную очередь для каждого сообщения, тогда как я создаю временную очередь на время существования производителя. Эта временная очередь уничтожается при закрытии приложения клиента (производителя) или посредником AMQ, когда он понимает, что к этой временной очереди не подключен активный производитель.
- Я уже устанавливаю срок действия каждого сообщения на стороне источника, чтобы сообщение не задерживалось в очереди слишком долго (60 секунд).