当前位置: 首页 > 面试题库 >

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

何兴学
2023-03-14
问题内容

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

作为客户端上的url参数brokerURL。我立即使用此附加参数更改了我的客户代理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

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

为了进一步阐明我在代码中如何执行请求响应:

  1. 我已经使用了每个生产者的目的地(即临时队列),并将其设置在每条消息的回复标头中。
  2. 我已经在JMSCorrelationID标头中发送每条消息的唯一相关标识符。
  3. 据我所知,甚至Camel和Spring也使用临时队列进行请求-响应机制。唯一的区别是Spring JMS实现为每个消息创建并销毁了临时队列,而我在生产者的生命周期中创建了临时队列。当客户端(生产者)应用程序关闭时,或者当AMQ代理意识到此临时队列没有附加活动的生产者时,该临时队列将被销毁。
  4. 我已经在生产者端为每条消息设置了一条消息到期时间,以使消息不会在队列中停留太长时间(60秒)。

问题答案:

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

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

请注意,在activemq-core中没有使用该属性的测试,因此我无法对此提供任何保证。



 类似资料:
  • 我正试图找出如何利用ActiveMQ Artemis来实现以下拓扑结构。我确实需要有几个生产者写到两个独立的Artemis代理上托管的队列。目前,每个生产者创建两个连接工厂,处理到两个代理的连接,并创建相应的队列。 我的主要问题是,我需要知道哪个队列被分配给哪个代理,同时我需要知道,如果一个代理由于某种原因停机,我可以动态地为另一个代理重新创建该队列,以避免丢失任何进一步的消息。所以我的方法是如下

  • 有一种方法可以控制作业失败后在Azkaban中发生的事情,我的意思是,如果特定的作业失败,就做特定的事情,假设一个对hive的加载失败了,我想向splank发送错误,这可能吗?或者我应该创建特定的作业来插入并像python那样处理失败 谢谢

  • Webpack 的配置比较复杂,很容出现错误,下面是一些通常的故障处理手段。 一般情况下,webpack 如果出问题,会打印一些简单的错误信息,比如模块没有找到。我们还可以通过参数 --display-error-details 来打印错误详情。 $ webpack --display-error-details Hash: a40fbc6d852c51fceadb Version: webpa

  • 我正在开发一个使用activemq交换消息的应用程序,有些消息太大了,我想取消。 我们使用两个activemq实例(主/从)的activemq故障转移传输。代理本身对消息有100mb的帧大小限制。 问题是:如果我尝试发送大于100mb的消息,ActiveMQ服务器将关闭连接。此时,故障转移传输将尝试重新连接并再次发送消息,从而创建无限循环。 客户端记录以下内容: 当activeMQ实例记录时: 我

  • 问题内容: 我有一个用于捕获任何分段错误或ctrl- c的应用程序。使用下面的代码,我能够捕获分段错误,但是该处理程序一次又一次地被调用。我该如何阻止他们。供您参考,我不想退出我的申请。我只是可以小心释放所有损坏的缓冲区。 可能吗? 处理程序就是这样。 在这里,对于Segmentation故障信号,处理程序被多次调用,并且很明显MyfreeBuffers()给我释放已释放的内存的错误。我只想释放一