ActiveMQ不在代理之间分发消息

时间:2015-01-15 22:15:52

标签: jms activemq

我在完整图形拓扑上有一个代理网络,在不同的服务器上有3个节点:A,B和C.每个代理都附加了一个生产者,出于测试目的,代理C上只有一个非代理消费者。我使用完整图拓扑,每个代理还为每个其他节点都有一个代理消费者。

问题是:A收到一些消息。我希望它将这些消息转发给经纪人C,经纪人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 个答案:

答案 0 :(得分:1)

默认情况下,networkTTL为1(请参阅documentation),因此当B上的生产者发布消息时,如果它采用A的路径(它将在50%的时间内执行您的配置是因为您已将代理设置为在消费者之间进行循环,更多的是在一秒钟内进行循环),不允许将其转发到C.您可以通过增加值来解决问题networkTTL,但更好的解决方案是设置decreaseNetworkConsumerPriority=true(请参阅上述相同链接的文档),以确保消息始终尽可能直接地发送给他们所指定的消费者。

但请注意,如果您的消费者在网格中移动,这可能会对消息产生影响,因为networkTTL值不会允许其他转发,并且因为消息不允许重新发送给他们已经通过的经纪人。您可以通过将networkTTL设置为更大的值(例如20,完全安全)并应用&#34; Stuck Messages&#34;中所述的replayWhenNoConsumers=true策略设置来解决这些问题。该文档页面的一部分。这些设置都不是绝对必要的,只要您确定您的消费者永远不会转移到其他经纪人,或者您确实在发生消息时丢失了一些消息。