当前位置: 首页 > 知识库问答 >
问题:

ActiveMQ主题到队列,当使用骆驼路由消息丢失时,从主切换到从?

冯宏恺
2023-03-14

设置:默认ActiveMQ.XML。本地数据中心的3台服务器上的每台服务器一个ActiveMQ实例,远程数据中心服务器上的每个服务器一个Active MQ实例。所有3个1实例都在运行,但每个数据中心在任何给定时刻只有一个ActiveMQ实例是主实例。来自所有数据中心的所有实例的消息都将持久化到网络KahaDB,我们为每条消息配置了两次重试。

目标:保持数据中心之间的队列同步。

问题:要测试远程服务器何时关闭,所有消息都将被保存/持久化,直到远程服务器重新联机。我将向ActiveMQ主题发送三条消息。

骆驼路由被配置为读取主题并推送到2个本地队列。

第二个camel路由设置为从一个本地队列中读取,并将消息推送到远程ActiveMQ。

当远程服务器关闭(数据中心2关闭),并且我们从主ActiveMQ(通过停止服务)故障切换到从服务器时,3条消息中的1条消息将丢失到以太。这似乎是发送到远程服务器的第一条消息。就好像连接被拒绝了什么的,它就永远消失了,甚至连DLQ都没有?

骆驼配置:

<bean id="local" class="org.apache.activemq.camel.component.ActiveMQComponent">
  <property name="brokerURL" value="tcp://localhost:12345"/>
  <property name="preserveMessageQos" value="true" />
</bean>

<bean id="remote" class="org.apache.activemq.camel.component.ActiveMQComponent">
  <property name="brokerURL" value="failover:(tcp://remotehost:54321)"/>
  <property name="preserveMessageQos" value="true" />
</bean>

<camelContext id="topicToQueueCamelContext" xmlns="http://camel.apache.org/schema/spring">
    <route id="topicToQueue">
        <from uri="local:topic:SomeTopic"/>
        <to uri="local:queue:SomeQueue"/>
        <to uri="local:queue:SomeQueue.Remote"/>
    </route>
</camelContext>

<camelContext id="queueToRemoteQueueCamelContext" xmlns="http://camel.apache.org/schema/spring">
    <route id="queueToRemoteQueue">
        <from uri="local:queue:SomeQueue.Remote"/>
        <to uri="remote:queue:SomeQueue"/>
    </route>
</camelContext>

尝试:将远程骆驼路由设置为事务处理,并在代理URL故障转移传输上设置trackMessages=true。

是否有人对ActiveMQ BrokerURL、ActiveMQ XML或Camel URI查询字符串参数可能丢失有任何想法——或者对如何解决或调试此丢失消息问题有任何想法?

共有1个答案

郑俊材
2023-03-14

您需要配置您的< code>ActiveMQComponent来使用事务性消息。默认情况下,消息消费不是事务性的。这样您可以获得最佳性能,但是您也“接受”丢失消息。

 类似资料:
  • 生产者可以发送两种不同的消息类型;和(每个消息的内容无关,但假设它们都有一个字段)。每个消息使用的路由密钥分别是和。生产者不依赖默认的Java序列化,而是使用。 使用者有一个队列,该队列使用的路由键绑定到同一个交换。一旦使用,使用者所要做的就是在日志文件中打印每个消息的。为了检索字段的值,需要将JSON有效负载转换为某种对象。 这两个组件之间不共享消息类(和)。使用者的对象在其消息表示中可能有或多

  • 我试图通过驼峰路由将消息放到Weblogic JMS中的队列中。 我的目标是最终配置一个Route以使用来自jms队列的消息,我将早期Route的数据发布到该队列。 这是我的配置: 我的路线如下所示: 我尝试执行此路由时遇到此异常: 我按照以下过程创建了此处提到的队列:https://blogs.oracle.com/soaproactive/entry/how_to_create_a_simpl

  • 我在MyRouteBuilder中有一条骆驼路线。正在使用ActiveMQ消息的java文件: 我写了一个测试用例如下: 当我运行单元测试用例时,我得到了这个奇怪的错误: 看到这些信息,我尤其感到困惑: 和 虽然我有一个正确的队列名称,但为什么队列显示为?还有,为什么代理url? 我想运行这个单元测试用例,以便它在所有环境中正常运行,如:本地、DIT、SIT、PROD等。因此,我不能负担的经纪人u

  • 我使用骆驼与hazelcast组件和面临的问题与交换头,当交换通过hazelcast seda。 我需要轮询目录中的文件,并将交换发送到seda hazelcast队列(以处理集群中的交换)。 这种情况有一个简单的例子。有两个路由,在其他JVM中运行: 首先是轮询文件: 第二个问题是: 当我试图阅读像或其他,我意识到它们是空的。 通过hazelcast seda组件传输交换时,是否可以保存标头?

  • 我正在使用死信频道EIP与骆驼文件中描述的死信频道完全相同。这是我的camel.xml(删除头) 我只有一条路由具有基于内容的路由器,其实质是,如果消息体具有getInfo,则从jms:foo路由到jms:getInfo,如果消息体具有performAction,则从jms.foo路由到jms:performAction 我预计,当jms:getInfo使用者没有运行时,交付将失败,重新交付尝试将