当一个消费者崩溃时,ActiveMQ多消费者停止消费

时间:2019-01-10 15:36:05

标签: apache-camel activemq apache-karaf jbossfuse blueprint-osgi

我们在一个集合中配置了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&amp;jms.prefetchPolicy.queuePrefetch=0&amp;jms.rmIdFromConnectionId=true&amp;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消息卡在队列中。

1 个答案:

答案 0 :(得分:0)

这很奇怪。我首先想到了预取大小,但是您已经将它们设置为零。我建议再次运行该方案。当上述情况到来

  1. 检查经纪人日志
  2. 通过JMX检查使用者和队列(状态,内存等)

也许暂时删除交易管理器也值得一试,以确保不会由于交易而出现此问题。