【发布时间】:2011-09-19 22:23:55
【问题描述】:
在我的 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 代理意识到此临时队列没有附加活动生产者时,它会被销毁。
- 我已经在 Producer 端为每条消息设置了消息过期时间,这样消息就不会在队列中等待太久(60 秒)。
【问题讨论】:
-
新的
JMSException是刚刚登录还是扔到您的客户端代码中?此外,客户端发送给代理的每条消息都会引发异常,还是在故障转移完成时异常停止? (即异常是否只在客户端未连接时抛出?) -
除了
jms.watchTopicAdvisories=false(即XML 配置中的<broker advisorySupport="false">)和静态配置网络之外,还有一些seems to be 需要做的事情。 (你的 amq1.xml 文件给了我一个 404 Not Found) -
@Bringer128:感谢您的评论。该 JMS 异常会在生产者重新连接后连接的其他 AMQ 代理上引发。一旦发生这种情况,JMS 生产者将停止接收来自消费者的任何响应,因为 AMQ 代理无法将回复发送回具有上述 JMS 异常的生产者。
-
@opyate:感谢您的建议。然而,只是为了让您知道
advisorySupport="false"临时目的地在当前的 AMQ5.5 版本中不起作用,即使使用staticallyIncludedDestinations。但是,根据我的要求,此功能已在即将发布的 5.6 版本中添加。请在此处查看我与 Gary Tully 的对话:activemq.2283324.n4.nabble.com/… 了解更多详情
标签: java jms activemq failovercluster