Apache ActiveMQ dlqDeliveryFailureCause java.lang.Throwable:从存储区为队列复制
我有一个ActiveMQ v5.14.1的3代理设置。该设置涉及一组复合目的地,这些目的地从另一个队列中提取消息的副本。以下是其中一个代理的配置-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}"
<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&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&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