java - ActiveMQ:如何在使用临时队列时处理代理故障转移

标签 java jms activemq failovercluster

在我的 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

这里有人可以调查一下这个问题,并建议我在这个设置中犯了什么错误。

更新:

进一步阐明我如何在我的代码中进行请求-响应:

  1. 我已经使用了每个生产者目的地(即临时队列)并将其设置在每条消息的回复 header 中。
  2. 我已经在 J​​MSCorrelationID header 中发送了每条消息的唯一相关标识符。
  3. 据我所知,甚至 Camel 和 Spring 也在使用临时队列来实现请求-响应机制。唯一的区别是 Spring JMS 实现为每条消息创建和销毁临时队列,而我为生产者的生命周期创建临时队列。当客户端(生产者)应用关闭时,此临时队列将被销毁,或者当 AMQ 代理意识到此临时队列没有附加 Activity 生产者时,它会被销毁。
  4. 我已经在 Producer 端为每条消息设置了消息过期时间,这样消息就不会在队列中等待太久(60 秒)。

最佳答案

有一个代理属性 org.apache.activemq.broker.BrokerService#cacheTempDestinations 应该有助于故障转移:案例。 在 xml 配置中将其设置为 true,当客户端断开连接时,不会立即删除临时目标。 快速故障转移:重新连接将能够再次从临时队列中生产和/或消费。

有一个基于 timeBeforePurgeTempDestinations(默认 5 秒)的计时器任务来处理缓存删除。

但有一点需要注意,我在 activemq-core 中没有看到任何使用该属性的测试,因此我无法对此提供任何保证。

关于java - ActiveMQ:如何在使用临时队列时处理代理故障转移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6432672/

相关文章:

java - 进程内 ActiveMQ 生产者/消费者示例?

java - 构造函数和用户输入遇到问题

java - 计算非平凡问题的时间复杂度

java - 从一个 Wildfly 10 应用程序连接到另一个应用程序的远程 JMS 队列时出现问题

spring - DefaultJmsListenerContainerFactory 和并发连接未关闭

java - 并发处理-JMS

java - 具有 ActiveMQ 代理网络的 JMS 消费者

java - ActiveMQ 从队列中获取所有消息

java - 以 root 身份运行 JNI native 代码 (Mac)

java - Android 没有资源匹配 android :windowIsFloating