设置:默认的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查询字符串参数的任何想法-或对如何解决或调试此丢失的消息问题有任何想法吗?
答案 0 :(得分:1)
您需要将ActiveMQComponent
配置为consume messages transactional。默认情况下,消息消费是不是事务性的。这样,您可以获得最佳性能,但是您也“接受”丢失消息。