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

|| 在我的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
作为客户端
brokerURL
上的url参数。我立即使用此附加参数更改了我的客户代理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秒)。     
已邀请:
        有一个代理属性org.apache.activemq.broker.BrokerService#cacheTempDestinations应该有助于故障转移:案例。 在xml配置中将其设置为true,并且在客户端断开连接时不会立即删除临时目标。 快速故障转移:重新连接将能够再次从临时队列中产生和/或使用。 有一个基于timeBeforePurgeTempDestinations的计时器任务(默认为5秒),用于处理高速缓存的删除。 请注意,在activemq-core中我没有看到使用该属性的任何测试,因此我无法对此提供任何保证。     
在请求-答复方案中,请求者(生产者)连接到的代理上创建临时队列。它们是从“ 5”创建的,因此在该会话断开连接时,由于客户端断开连接或代理故障/故障转移,这些队列将永久消失。当您的一个消费者尝试回复这些队列时,其他任何经纪人都不会理解这是什么意思;因此,您例外。 假设您要处理故障转移并保留所有消息,这需要对思维定式进行架构上的转变。这是可以解决问题的一般方法: 您的回复标头应引用特定于请求者进程的队列:
queue:response.<client id>
。如果客户端数量有限,则客户端ID可能是标准名称,如果客户端数量很多,则可能是UUID。 出站消息应设置一个关联标识符(简单地是一种字符串,它使您可以将请求与响应相关联-毕竟请求者可能同时发出多个请求)。这是在“ 7”标头中设置的,应该从请求复制到响应消息。 请求者需要在该队列上设置一个侦听器,该侦听器将根据该相关ID将消息正文返回给请求线程。为此,需要编写一些多线程代码,因为您将需要手动管理类似相关性ID到原始线程的映射(可能通过Futures)。 这与Apache Camel用于通过消息进行请求响应的方法类似。 要注意的一件事是,当客户端运行时队列不会消失,因此您应该设置一个生存时间,以便在响应消息上保留该消息,以便在尚未使用该消息时将其从代理中删除,否则您将获得未使用消息的积压。您还需要设置一个死信队列策略,以自动丢弃过期的消息。     

要回复问题请先登录注册