在我的JMS应用程序上,我们在生产者上使用临时队列,以便能够接收来自消费者应用程序的回复。
我最终遇到的问题与该线程中提到的问题完全相同: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:...然后我看到Gary的回应建议使用
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版本。我的客户经纪人网址如下所示:
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
另外,这是我对4个代理之一的activemq配置XML: amq1.xml
这里有人可以调查一下这个问题,并建议我在此设置中犯了什么错误。
更新:为了进一步阐明我在代码中如何执行请求-响应:
我已经使用了每个生产者的目的地(即临时队列),并将其设置在每条消息的回复标头中。我已经在JMSCorrelationID标头中发送每条消息的唯一相关标识符。据我所知,甚至Camel和Spring也使用临时队列进行请求-响应机制。唯一的区别是Spring JMS实现为每个消息创建并销毁了临时队列,而我在生产者的生命周期中创建了临时队列。当客户端(生产者)应用程序关闭时,或当AMQ代理意识到此临时队列中没有活动的生产者时,该临时队列将被销毁。我已经在生产者端为每条消息设置了一条消息到期时间,以使消息不会在队列中保留太长时间(60秒)。