Apache ActiveMQ dlqDeliveryFailureCause java.lang.Throwable:从存储区为队列复制

Apache ActiveMQ dlqDeliveryFailureCause java.lang.Throwable:从存储区为队列复制,apache,activemq,message-queue,Apache,Activemq,Message Queue,我有一个ActiveMQ v5.14.1的3代理设置。该设置涉及一组复合目的地,这些目的地从另一个队列中提取消息的副本。以下是其中一个代理的配置- <broker xmlns="http://activemq.apache.org/schema/core" brokerName="brokerC" dataDirectory="${activemq.data}"

我有一个ActiveMQ v5.14.1的3代理设置。该设置涉及一组复合目的地,这些目的地从另一个队列中提取消息的副本。以下是其中一个代理的配置-

    <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>

此异常位于dlq中消息的标题“dlqDeliveryFailureCause”中。我观察到,在1个代理设置中,这个问题从未出现过。只有当我设置了2个或更多的代理网络时,才会出现这种情况。

如果有人在这个问题上遇到困难,请查看以下链接


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

如果有人在这个问题上陷入困境,请查看以下链接


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

两年后,你找到了这个问题的解释或解决方案吗?相关的讨论仍然没有结论。我与5.14.1和代理端的复合队列有相同的问题,它会抛出相同的错误并将消息放入DLQ。@DoNuT我现在不记得100%的事情了,但某种程度上原因如下-在代理设置的网络中,我们发现,如果代理C拥有消费者,并且消息从代理A->代理B->代理C传播,那么代理B将获得相同消息的两个副本—1个从Q.1转发,另一个从Q.2转发。从本质上讲,我们通过迁移到主从配置解决了这种情况(更多是因为这更适合我们的用例)。如果您尝试识别代理之间正在跳转的消息(不应该是跳转的),应该可以帮助您解决这个问题。感谢您这么快回来。遗憾的是,我的设置是一个单独的代理AMQ,唯一的特定部分是转发(队列->队列和主题->队列)。在我的例子中,在将副本抛出DLQ之前,我从producers连接中看到一个
EOFEException
,然后是几秒钟后的复制自存储错误。制作人正在使用Openwire和重新连接,我想这超出了此票证的范围,如果我从客户端/制作人端查看日志,可能会得到更好的图片。@DoNuT这可能会有所帮助-。查看是否有未完全关闭的连接。假设是这种情况,您也可能会生成重复副本。这是与VPN站点到站点连接断开一起发生的,但由于这是意外断开,我无法保证100%的可用性,可能与重新连接有关(总是在客户端断开后大约20秒发生)。两年后,你找到这个问题的解释或解决方案了吗?相关的讨论仍然没有结论。我与5.14.1和代理端的复合队列有相同的问题,它会抛出相同的错误并将消息放入DLQ。@DoNuT我现在不记得100%的事情了,但某种程度上原因如下-在代理设置的网络中,我们发现,如果代理C拥有消费者,并且消息从代理A->代理B->代理C传播,那么代理B将获得相同消息的两个副本—1个从Q.1转发,另一个从Q.2转发。从本质上讲,我们通过迁移到主从配置解决了这种情况(更多是因为这更适合我们的用例)。如果您尝试识别代理之间正在跳转的消息(不应该是跳转的),应该可以帮助您解决这个问题。感谢您这么快回来。遗憾的是,我的设置是一个单独的代理AMQ,唯一的特定部分是转发(队列->队列和主题->队列)。在我的例子中,在将副本抛出DLQ之前,我从producers连接中看到一个
EOFEException
,然后是几秒钟后的复制自存储错误。制作人正在使用Openwire和重新连接,我想这超出了此票证的范围,如果我从客户端/制作人端查看日志,可能会得到更好的图片。@DoNuT这可能会有所帮助-。查看是否有未完全关闭的连接。假设是这种情况,您也可能会生成重复副本。这种情况与VPN站点到站点连接断开一起发生,但由于这是意外断开,我无法保证100%的可用性,可能与重新连接有关(通常发生在客户端断开后大约20秒)。
java.lang.Throwable: duplicate from store for queue://Q.2