在我的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:...
然后我看到Gary在那里建议使用
jms.watchTopicAdvisories=false
作为客户端brokerURL的url参数。我立即使用这个额外的参数更改了我的客户端经纪人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
此外,这是我其中一个4个代理的activemq配置XML:
amq1.xml请有经验的人查看这个问题,并建议我在此设置中犯了什么错误。
更新:
为了更进一步说明我在代码中如何进行请求-响应:
- 我已经使用每个生产者目的地(即临时队列),并将其设置在每条消息的回复头中。
- 我已经在JMSCorrelationID头中发送每个消息的唯一关联标识符。
- 据我所知,即使是Camel和Spring也在使用临时队列进行请求-响应机制。唯一的区别是,Spring JMS实现会为每个消息创建和销毁临时队列,而我为生产者的生命周期创建临时队列。该临时队列在客户端(生产者)应用程序关闭或AMQ代理发现没有连接到该临时队列的活动生产者时将被销毁。
- 我已经在生产者端的每个消息上设置了消息过期时间,以便消息不会在队列中被保留太长时间(60秒)。
JMSException
只是被记录在日志中还是会抛出到客户端代码中?此外,异常是否会在客户端发送到代理的每个消息上抛出,或者当故障转移完成时异常是否停止?(即,异常只在客户端未连接时抛出吗?) - user545680jms.watchTopicAdvisories=false
之外,似乎还需要做一些其他事情,例如在 XML 配置中添加<broker advisorySupport="false">
,以及静态配置您的网络。(您的 amq1.xml 文件给我返回了 404 Not Found) - opyatestaticallyIncludedDestinations
,在当前的AMQ5.5版本中,带有advisorySupport="false"
的临时目标也不起作用。 但是,根据我的要求,此功能已添加到即将发布的5.6版本中。 请参见我与Gary Tully的对话,链接在此处:http://activemq.2283324.n4.nabble.com/network-of-broker-stop-forwarding-messages-without-advisorySupport-enabled-td3386261.html,以获取更多详细信息。 - anubhava