2015-01-15 42 views
0

我有一个完整图拓扑结构的经纪人网络,在不同服务器上有3个节点:A,B和C.每个经纪人都有一个生产者附加,为了测试目的,只有一个非经纪人代理商C上的消费者。当我使用完整图表拓扑时,每个代理还具有其他每个节点的代理消费者。ActiveMQ不在经纪人之间分配消息

问题是:A收到几条消息。我期望它将这些消息转发给经纪人C,后者拥有一位“真正”的消费者。这种情况没有发生,经纪人A将这些消息存储起来,直到“真正的”消费者连接到它。

我的配置(或理解)有什么问题?

我使用的是ActiveMQ 5.9.0。

这里是我的经纪人A. activemq.xml中这是相同的B,C,只改变名称:

<beans 
    xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
    http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd"> 

<broker xmlns="http://activemq.apache.org/schema/core" brokerName="broker-A" dataDirectory="${activemq.data}"> 

    <destinationPolicy> 
     <policyMap> 
      <policyEntries> 
       <policyEntry topic="tokio.>"> 
        <subscriptionRecoveryPolicy> 
         <noSubscriptionRecoveryPolicy/> 
        </subscriptionRecoveryPolicy> 
        <pendingMessageLimitStrategy> 
         <constantPendingMessageLimitStrategy limit="1000"/> 
        </pendingMessageLimitStrategy> 
       </policyEntry> 
      </policyEntries> 
     </policyMap> 
    </destinationPolicy> 

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

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

    <systemUsage> 
     <systemUsage> 
      <memoryUsage> 
       <memoryUsage percentOfJvmHeap="70" /> 
      </memoryUsage> 
      <storeUsage> 
       <storeUsage limit="40 gb"/> 
      </storeUsage> 
      <tempUsage> 
       <tempUsage limit="10 gb"/> 
      </tempUsage> 
     </systemUsage> 
    </systemUsage> 

    <networkConnectors> 
     <networkConnector name="linkTo-broker-B" 
          uri="static:(tcp://SRVMSG01:61616)" 
          duplex="true" 
       /> 
     <networkConnector name="linkTo-broker-C" 
          uri="static:(tcp://SRVMSG03:61616)" 
          duplex="true" 
       /> 
    </networkConnectors> 

    <transportConnectors> 
     <transportConnector uri="tcp://localhost:0" discoveryUri="multicast://default"/> 
     <transportConnector name="nio" uri="nio://0.0.0.0:61616" /> 
    </transportConnectors> 

</broker> 

</beans> 

回答

1

默认情况下,networkTTL为1(见documentation),所以当第B生产者发布一个消息,如果它需要A的路径(它会在你的配置中占用50%的时间,因为你已经让代理在消费者之间循环,而在一秒之内),这是不允许的被转发给C.您可以通过增加networkTTL的值来解决问题,但更好的解决方案是设置decreaseNetworkConsumerPriority=true(请参阅与上述链接相同的文档)以确保邮件始终按照dir尽可能地向他们注定的消费者。

但是,请注意,如果您的消费者在网格中移动,则这可能会混淆消息,因为networkTTL值不会允许额外的转发,并且消息不允许重新发送给他们经纪人已经通过。您可以通过将networkTTL设置为更大的值(如20,以确保安全)并通过应用同一文档页面的“Stuck Messages”部分中所述的replayWhenNoConsumers=true策略设置来解决这些问题。这些设置都不是绝对必要的,只要你确定你的消费者永远不会转移到另一个经纪人,或者你确定在发生时会丢失一些消息。

+0

这一项无效。我还必须指定通过将队列添加为dynamicallyIncludedDestinations,代理将如何通过代理进行传播。 –

+1

我解释为“A收到一些消息”,意思是有些消息被转发给A,但并不是所有消息都是(而其余的都是C成功的),所以我甚至没有考虑过你可能会不是转发*任何*消息。我很高兴你想出了解决方案。 – Tim

相关问题