ActiveMQ dlqDeliveryFailureCause java.lang.Throwable:从 queue 的商店复制

ActiveMQ dlqDeliveryFailureCause java.lang.Throwable: duplicate from store for queue

我有一个 ActiveMQ v5.14.1 的 3 代理设置。该设置涉及一组 composite-destinations,它从另一个 queue 中提取消息副本。以下是其中一个代理的配置 -

    <broker xmlns="http://activemq.apache.org/schema/core"
            brokerName="brokerC"
            dataDirectory="${activemq.data}"
            schedulePeriodForDestinationPurge="10000"
            schedulerSupport="true">

    <destinationPolicy>
        <policyMap>
          <policyEntries>
            <policyEntry queue=">" gcInactiveDestinations="true" inactiveTimoutBeforeGC="30000" >
               <deadLetterStrategy>
                  <sharedDeadLetterStrategy processExpired="false" />
               </deadLetterStrategy>

              <networkBridgeFilterFactory>
                <conditionalNetworkBridgeFilterFactory replayWhenNoConsumers="true"/>
              </networkBridgeFilterFactory>
            </policyEntry>
            <policyEntry topic=">" >
              <pendingMessageLimitStrategy>
                <constantPendingMessageLimitStrategy limit="1000"/>
              </pendingMessageLimitStrategy>
            </policyEntry>
          </policyEntries>
        </policyMap>
    </destinationPolicy>

    <!-- Added entry for network of brokers -->
    <networkConnectors>
      <networkConnector name="linkFromCToA"
                        uri="static:(tcp://xx.xxx.xx.xxx:61616)"
                        useVirtualDestSubs="true"/>

      <networkConnector name="linkFromCToB"
                        uri="static:(tcp://xx.xxx.xx.xxx:61616)"
                        useVirtualDestSubs="true"/>
    </networkConnectors>
    <managementContext>
        <managementContext createConnector="false"/>
    </managementContext>

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


      <systemUsage>
        <systemUsage>
            <memoryUsage>
                <memoryUsage percentOfJvmHeap="70" />
            </memoryUsage>
            <storeUsage>
                <storeUsage limit="20 gb"/>
            </storeUsage>
            <tempUsage>
                <tempUsage limit="50 gb"/>
            </tempUsage>
        </systemUsage>
    </systemUsage>

    <transportConnectors>
        <!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->
        <transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
        <transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
        <transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
        <transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
        <transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
    </transportConnectors>

    <!-- destroy the spring context on shutdown to stop jetty -->
    <shutdownHooks>
        <bean xmlns="http://www.springframework.org/schema/beans" class="org.apache.activemq.hooks.SpringContextHook" />
    </shutdownHooks>

    <destinationInterceptors>
      <virtualDestinationInterceptor>
        <virtualDestinations>
          <compositeQueue name="Q.1" forwardOnly="false">
            <forwardTo>
              <queue physicalName="Q.2" />
            </forwardTo>
          </compositeQueue>
        </virtualDestinations>
      </virtualDestinationInterceptor>
    </destinationInterceptors>


</broker>

所有 3 个代理的这些配置都相似(当然,代理 url 除外)。一段时间后,在所有 3 个经纪人的 dlq 上,我看到以下异常 -

java.lang.Throwable: duplicate from store for queue://Q.2

这个异常在dlq中的消息header 'dlqDeliveryFailureCause'中。我观察到,在 1 个代理设置中,这个问题从未出现过。仅当我设置了 2 个或更多经纪人网络时。

对于遇到此问题的任何人,请查看以下内容 link ActiveMQ User discussion.

两个建议 1. 在队列级别禁用审核和 2. 更改 messageTTL=2(因为我有 3 个代理)。