В моих JMS-приложениях мы используем временные очереди для Продюсеров, чтобы получать ответы от потребительских приложений.
Я столкнулся с такой же проблемой на моем конце, как упоминалось в этом потоке: 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
Кроме того, здесь приведен мой XML файл activemq для одного из 4-х брокеров: amq1.xml
Может кто-то здесь, пожалуйста, изучите эту проблему и предложите мне, какую ошибку я делаю в этой настройке.
Update:
Чтобы уточнить, как я выполняю запрос-ответ в своем коде:
- Я уже использую назначение для каждого производителя (т.е. временную очередь) и устанавливаю его в заголовке ответа на каждое сообщение.
- Я уже отправляю уникальный идентификатор корреляции для сообщения в заголовке JMSCorrelationID.
- Насколько я знаю, даже Camel и Spring также используют временную очередь для механизма запроса-ответа. Единственное отличие состоит в том, что реализация Spring JMS создает и уничтожает временную очередь для каждого сообщения, тогда как я создаю временную очередь для жизни продюсера. Эта временная очередь уничтожается при закрытии приложения клиента (продюсера) или брокером AMQ, когда он понимает, что с этой временной очередью нет активного производителя.
- Я уже устанавливаю истечение сообщения для каждого сообщения на стороне Продюсера, чтобы сообщение не задерживалось в очереди слишком долго (60 секунд).