在我的JMS应用程序上,我们使用生产者上的临时队列来接收消费者应用程序的回复。ActiveMQ:如何在使用临时队列时处理代理故障转移
我面对我的结束正是同样的问题在这个线程中提到: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
为AU rl param在客户端brokerURL
上。我立即用这个附加参数更改了我的客户端代理网址。
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
另外这里是4个经纪人我的一个ActiveMQ的XML配置: amq1.xml
能有人在这里请看看这个问题,并建议我有什么错误,我我正在制作这个设置。
更新:
为了进一步澄清,我怎么在我的代码做请求 - 响应:
- 我已经使用每生产目标(即临时队列),并将其设置在答复向每封邮件的标题。
- 我已经在JMSCorrelationID标头中发送了每个消息的唯一关联标识符。
- 据我所知即使骆驼和Spring也使用临时队列来请求响应机制。唯一的区别是Spring JMS实现为每条消息创建并销毁临时队列,而我为生产者的生命周期创建临时队列。当客户端(生产者)应用程序关闭时,此临时队列会被销毁,或者AMQ代理在意识到没有活动的生产者与此临时队列连接时会被销毁。
- 我已经在Producer端的每条消息上设置了消息到期时间,以便消息不会在队列中滞留太久(60秒)。
新的'JMSException'是刚登录还是抛入客户端代码?另外,客户端发送给代理的每条消息是否抛出异常,或者故障转移完成时异常是否停止? (即只有在客户端没有连接的时候抛出异常?) – Bringer128
[似乎是](http://activemq.apache.org/advisory-message.html#AdvisoryMessage-Disablingadvisorymessages)有几件事情您需要在XML配置中添加'jms.watchTopicAdvisories = false',即'',并静态配置您的网络。 (你的amq1.xml文件给我404 Not Found) –
opyate
@ Bringer128:感谢您的评论。该JMS异常在重新连接后生产者连接的其他AMQ代理上引发。而且一旦发生这种情况,JMS生产者只是停止接收来自消费者的任何响应,因为AMQ代理不能将回复发回给具有上述JMS异常的生产者。 – anubhava