2011-04-14 182 views
1

我们有两个activemq实例配置为一个集群和一个四个glassfish实例的集群,在任何给定时间都应该连接到一个activemq。如果activemq01不可用,则所有四个glassfish实例都应在activemq02上进行故障转移。activeMQ多个消费者问题

我注意到了几次,出于不明原因,其中一个(随机)glassfish实例将在activemq02上进行故障转移,其余三个实例仍将连接到activemq01,即使activemq01未关闭,并且所有glassfish实例应该一直在收听activemq01。

日志没有指出任何可以解释这种行为的东西,只有那一个glassfish实例无法连接到activemq01和activemq02上的故障转移才能看到。

有没有人遇到过相同或类似的问题?任何帮助/意见,不胜感激。

这里是我的ActiveMQ CONFIGS:

activemq01:

http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-豆类,2.0.XSD http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd“>

文件:$ {} activemq.base /conf/credentials.properties

<managementContext> 
    <managementContext connectorPort="1093" createConnector="true"/> 
</managementContext> 

<networkConnectors> 
    <networkConnector name="amq-prod" uri="static://(tcp://127.0.0.1:61616,tcp://192.168.0.167:61616)" /> 
</networkConnectors> 


<persistenceAdapter> 
    <kahaDB directory="${activemq.base}/data/kahadb"/> 
</persistenceAdapter> 

<plugins> 
    <loggingBrokerPlugin logAll="false" logConnectionEvents="true"/> 
</plugins> 


<systemUsage> 
    <systemUsage> 
    <memoryUsage> 
     <memoryUsage limit="2048 mb"/> 
    </memoryUsage> 
    <storeUsage> 
     <storeUsage limit="2 gb" name="prod"/> 
    </storeUsage> 
    <tempUsage> 
     <tempUsage limit="2000 mb"/> 
    </tempUsage> 
    </systemUsage> 
</systemUsage> 

<transportConnectors> 
    <transportConnector name="openwire" uri="tcp://0.0.0.0:61616" updateClusterClients="true" /> 
</transportConnectors> 

activeMQ02:

http://www.springframework.org/schema/beans http://www.springframework.org/ schema/beans/spring-beans-2.0.xsd http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd“>

文件:$ {} activemq.base /conf/credentials.properties

<managementContext> 
    <managementContext connectorPort="1093" createConnector="true"/> 
</managementContext> 

<networkConnectors> 
    <networkConnector name="amq-prod" uri="static://(tcp://127.0.0.1:61616,tcp://192.168.0.166:61616)" /> 
</networkConnectors> 


<persistenceAdapter> 
    <kahaDB directory="${activemq.base}/data/kahadb"/> 
</persistenceAdapter> 

<systemUsage> 
    <systemUsage> 
    <memoryUsage> 
     <memoryUsage limit="2048 mb"/> 
    </memoryUsage> 
    <storeUsage> 
     <storeUsage limit="2 gb" name="prod"/> 
    </storeUsage> 
    <tempUsage> 
     <tempUsage limit="2000 mb"/> 
    </tempUsage> 
    </systemUsage> 
</systemUsage> 

<transportConnectors> 
    <transportConnector name="openwire" uri="tcp://0.0.0.0:61616" updateClusterClients="true" /> 
</transportConnectors> 

activeMQ版本 - 5.4。1

回答

1

有你networkConnector标签定义如下:

acticemq01配置:

<networkConnector 
     name="amq1-nc" 
     uri="static:(failover:(tcp://192.168.0.167:61616))" 
     networkTTL="2" 
     duplex="true" 
     dynamicOnly="true" 
    /> 

acticemq02配置:

<networkConnector 
     name="amq2-nc" 
     uri="static:(failover:(tcp://192.168.0.166:61616))" 
     networkTTL="2" 
     duplex="true" 
     dynamicOnly="true" 
    /> 

而在你的消费者使用JMS提供者URL是这样的:

failover:(tcp://192.168.0.166:61616,tcp://192.168.0.167:61616)?randomize=false&timeout=5000 

以上failover URL将始终连接到acticemq01经纪人(如果可用)。如果acticemq01发生故障,它会自动故障切换到acticemq02代理。同样,timeout = 5000将确保消费者在5秒内抛出错误,试图连接到任何2个经纪人。

+0

谢谢Anubhava!这个配置的问题是,当我停止activemq01时,activemq02上的连接失败,但是当我尝试启动activemq01并停止activemq02时,消费者没有故障恢复到activemq01。 – Nerses 2011-04-15 16:59:06

+0

我的待处理队列一直在堆叠,我花了很多时间研究和调整设置,并不确定发生了什么。这只发生在一个队列中。只是为了给你一些内部的信息,以防你可以建议通过一些配置改变来提高性能: – Nerses 2011-04-15 17:01:29

+0

生产者将消息对象放入队列中,队列中有几十个单独的联系人,然后消费者(4)监听队列,并选择消息(对象),解析并提交给移除供应商,当时是一个联系人。据了解,供应商交付的性能很慢,您认为如果我增加该队列的预取大小(当前是100),它会纠正问题,并且消息不会堆栈在待处理队列中?预先感谢您 – Nerses 2011-04-15 17:04:50