我们在一个集合中配置了3台服务器。所有保险丝服务器都是单一结构的一部分。如下检查当前设计,
3个根容器(ROOT 1、2和3) 每个Root容器都有2个子容器(一个用于Active MQ代理,另一个用于骆驼容器)。
ROOT 1-AMQ 1和CAMEL 1
ROOT 2-AMQ 2和CAMEL 2
根3-AMQ 3和CAMEL 3
AMQ 1,2和3是同一经纪人组的一部分。这意味着一次只有一个AMQ实例处于活动状态,而其他实例则用于故障转移。
CAMEL 1,2和3正在处理来自AMQ的消息。
问题:
我们在AMQ中处理了1000条消息,这些消息被所有使用者(即CAMEL 1,2和3)消耗。 但是,如果使用kill -9杀死了任何使用者(CAMEL 1,2或3),则AMQ中存在的消息将被阻塞,其余运行中的使用者将根本不对其进行处理。
检查以下在ActiveMQComponent蓝图中的配置,
<bean class="org.apache.activemq.ActiveMQXAConnectionFactory" id="activeMqXaConnectionFactory">
<property name="brokerURL" value="discovery:(fabric:test-broker-group)?wireFormat.maxInactivityDuration=30000&jms.prefetchPolicy.queuePrefetch=0&jms.rmIdFromConnectionId=true&alwaysSessionAsync=true"/>
<property name="trustAllPackages" value="true"/>
<property name="xaAckMode" value="2"/>
<property name="useAsyncSend" value="false"/>
<property name="redeliveryPolicy">
<bean class="org.apache.activemq.RedeliveryPolicy">
<property name="maximumRedeliveries" value="5"/>
</bean>
</property>
</bean>
<bean class="org.apache.activemq.pool.JcaPooledConnectionFactory" id="jmsXaPoolConnectionFactory" init-method="start" destroy-method="stop">
<property name="name" value="activemq.default"/>
<property name="transactionManager" ref="jtaTxManager"/>
<property name="connectionFactory" ref="activeMqXaConnectionFactory"/>
<property name="maxConnections" value="50"/>
<property name="idleTimeout" value="86400000"/>
</bean>
<bean class="org.apache.activemq.jms.pool.GenericResourceManager"
id="amqresourceManager" init-method="recoverResource">
<property name="transactionManager" ref="jtaTxManager"/>
<property name="connectionFactory" ref="activeMqXaConnectionFactory"/>
<property name="resourceName" value="activemq.default"/>
</bean>
<bean class="org.apache.activemq.camel.component.ActiveMQComponent" id="activemq">
<property name="configuration">
<bean class="org.apache.camel.component.jms.JmsConfiguration">
<property name="connectionFactory" ref="jmsXaPoolConnectionFactory"/>
<property name="transactionManager" ref="springJtaTxManager"/>
<property name="transacted" value="false"/>
<property name="cacheLevelName" value="CACHE_NONE"/>
<property name="concurrentConsumers" value="5"/>
<property name="acknowledgementModeName" value="CLIENT_ACKNOWLEDGE"/>
</bean>
</property>
</bean>
<service interface="org.apache.camel.Component" ref="activemq"/>
注意:不使用主题。只排队
我们还尝试了AUTO_ACKNOWLEDGE。但是仍然有相同的行为。
预期-即使任何使用者被杀死,也应处理消息。 实际-AMQ消息卡在队列中。
答案 0 :(得分:0)
这很奇怪。我首先想到了预取大小,但是您已经将它们设置为零。我建议再次运行该方案。当上述情况到来
也许暂时删除交易管理器也值得一试,以确保不会由于交易而出现此问题。