要排队的ActiveMQ主题,当使用骆驼路由消息时,从主站切换到从站会丢失吗?

时间:2019-01-03 17:29:26

标签: java apache-camel activemq

设置:默认的ActiveMQ.XML。本地数据中心的3台服务器上的每台服务器一个ActiveMQ实例,远程数据中心的Server上一个ActiveMQ实例。所有3 + 1实例都在运行,但是在每个数据中心的给定时刻,只有一个ActiveMQ实例是主实例。来自所有数据中心的所有实例的消息都保留在网络KahaDB中,并且我们为每个消息配置了两次重试。

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

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

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

第二条骆驼路线被设置为从一个本地队列中读取,并将消息推送到远程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>

尝试过的:将远程骆驼路由设置为已处理,并在brokerURL故障转移传输上设置trackMessages = true。

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

1 个答案:

答案 0 :(得分:1)

您需要将ActiveMQComponent配置为consume messages transactional。默认情况下,消息消费是不是事务性的。这样,您可以获得最佳性能,但是您也“接受”丢失消息。