Mule中的ActiveMQ负载均衡

时间:2012-08-23 13:41:38

标签: activemq messaging mule

我在使用Mule进行ActiveMQ负载均衡时遇到问题。我使用的是Mule 3.2.0和ActiveMQ 5.5.1

我有一个Mule FLow应用程序,它使用JMS入站端点来监听ActiveMQ中的队列。 我有两个运行AMQ的实例,每个实例都有一个名为“MyQueue”的队列。 让我们将它们命名为AMQ1和AMQ2。 我还有2个mule实例正在运行 - 每个实例都有相同的应用程序。我们将它们命名为Mule1和Mule2。

现在我想让每个mule实例从任一AMQ队列中获取消息。所以说消息发送者将消息发送到AMQ1或AMQ2中的队列MyQueue(使用ActiveMQ支持的故障转移传输的消息发送者负载平衡 - 并且该位工作正常)。说它达到了AMQ1。理想情况下,我想在每个AMQ实例中注册10个Mule1和Mule2消费者。所以他们都在侦听两个队列中的传入消息。其中一个应该从队列中获取消息并进行处理。

这是我在Mule中使用的配置,用于连接两个AMQ代理。

  <jms:activemq-connector name="Active_MQ"  brokerURL="failover:tcp://10.0.64.158:61616,tcp://10.0.64.160:61616)?randomize=true"  eagerConsumer="true" numberOfConsumers="10" dynamicNotification="true" validateConnections="true" clientId="MuleInstance1"  doc:name="Active MQ">
      <reconnect count="5" frequency="3000" blocking="false"/>

  </jms:activemq-connector>

请注意,clientId对于不同的Mule实例是不同的。目前,AMQ 1和Mule1共享同一台机器,AMQ2和Mule2共享另一台机器。

但是我注意到了随机行为。有时,所有消费者(Mule1和Mule2)都只注册一个AMQ实例。有时,Mule1仅注册到AMQ1,而Mule 2注册到AMQ2。 理想情况下我想要的是Mule1和Mule2的cosnumers注册到AM1和AMQ2 我按照这里的说明操作 http://www.mulesoft.org/documentation-3.2/display/MULE3USER/ActiveMQ+Integration

基本上我想使用代理体系结构网络,以便无论Mule实例或AMQ实例是否关闭或必须重新启动,都不会丢失服务。 在这种情况下,不确定 randomize = true 查询参数。

有人可以建议如何使用Mule 3.2.0和Active MQ 5.5.1来实现上述目标吗?

如果没有解决方案,我可能不得不让Mule1听AMQ1而Mule2只听AMQ2并且它不会真正聚集在一起:(

提前致谢。

1 个答案:

答案 0 :(得分:2)

搞定了。 得到了Mule论坛本身的建议。

http://forum.mulesoft.org/mulesoft/topics/activemq_loadbalancing_with_mule

因此,基本上不依赖于消费者的AMQ负载平衡,而是使用了2个AMQ连接器,并在每个mule应用程序中使用复合源来侦听2个入站EndPoints。这是一种享受。启动/关闭Mule和AMQ实例 - 所有这些都是一种享受。这是配置

      <jms:activemq-connector  name="Active_MQ_1"  brokerURL="failover:  (tcp://10.0.64.158:61616)"  eagerConsumer="true"  numberOfConsumers="10"  dynamicNotification="true"  validateConnections="true"  clientId="MuleInstance1"  doc:name="Active MQ">
       <reconnect count="5" frequency="3000" blocking="false"/>

     </jms:activemq-connector>
     <jms:activemq-connector  name="Active_MQ_2"  brokerURL="failover:(tcp://10.0.64.160:61616)"  eagerConsumer="true"  numberOfConsumers="10"  dynamicNotification="true"  validateConnections="true"  clientId="MuleInstance1"  doc:name="Active MQ">
     <reconnect count="5" frequency="3000" blocking="false"/>

      </jms:activemq-connector>

现在使用composite-source

在您的流程中引用它
  <flow name="MyAutomationFlow" doc:name="MyAutomationFlow">
      <composite-source>
          <jms:inbound-endpoint queue="MyOrderQ" connector-ref="Active_MQ1" doc:name="JMS Inbound Endpoint"/>
          <jms:inbound-endpoint queue="MyOrderQ" connector-ref="Active_MQ2" doc:name="JMS Inbound Endpoint"/>
      </composite-source>
   ........

做了一个款待!