首页 > 解决方案 > ActiveMQ Artemis:2 节点集群不使用队列

问题描述

我有一个非常简单的设置,有 2 个节点(相互连接)。我有一个单元测试,它在队列上生成 10 条消息,然后使用队列中的所有消息,然后检查它是否收到 10 条消息。

这是生产者和消费者设置

<bean id="queueListener" class="SessionAwareMessageListener<TextMessage>" />
<jms:listener-container container-type="default" destination-type="queue" connection-factory="brokerPooledConnectionFactory" acknowledge="auto">
    <jms:listener destination="queue.private.mb.sanity.V4" ref="queueListener" />
</jms:listener-container>

<bean id="queuePublisher" class="org.springframework.jms.core.JmsTemplate">
    <property name="connectionFactory" ref="brokerPooledConnectionFactory" />
    <property name="defaultDestinationName" value="queue.private.mb.sanity.V4" />
</bean>

和连接设置

<amq:connectionFactory
    brokerURL="failover:(tcp://${broker1.host}:${broker1.port},tcp://${broker2.host}:${broker2.port})?maxReconnectAttempts=1&amp;startupMaxReconnectAttempts=1"
    closeTimeout="100" id="brokerConnectionFactory" />

<!-- Pools of connections -->
<bean id="brokerPooledConnectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory" init-method="start" destroy-method="stop">
    <property name="maxConnections" value="5" />
    <property name="idleTimeout" value="0" />
    <property name="connectionFactory" ref="brokerConnectionFactory" />
    <property name="maximumActiveSessionPerConnection" value="100" />
    <property name="timeBetweenExpirationCheckMillis" value="60000" />
    <property name="expiryTimeout" value="600000" />
</bean>

我看到的是消息在 2 个节点上发送。第二个节点收到的消息全部被消费。第一个节点收到的一些消息被路由到第二个节点并从第二个节点消费。在第一个节点上接收到的其他消息既不被路由也不被消费。

如果我启动一个直接连接到第一个节点的消费者,它就可以使用这些消息。

使用主题而不是队列的相同测试可以正常工作。

知道为什么我会面临这种行为吗?

谢谢

尼古拉斯

标签: activemq-artemis

解决方案


确实,这是一个设置问题。消息负载平衡设置为 STRICT 而不是 ON_DEMAND。


推荐阅读