AMQP 忽略 ActiveMQ 5 重新传递策略

ActiveMQ 5 redelivery policies ignored with AMQP

我有一个 Spring 启动应用程序,它使用 Qpid JMS 与 ActiveMQ 5.15.14 代理对话 AMQP。即使配置了重新交付插件,代理的重新交付策略也会被忽略。然而,客户端 (Qpid) 的重新传递策略确实起作用了。

当将完全相同的代码和客户端配置连接到 ActiveMQ Artemis 代理时,代理的重新传送策略就会启动,这正是我正在寻找的。

您是否知道可以解释 ActiveMQ 5 和 ActiveMQ Artemis 之间的这种不同行为?除了重新交付策略之外,这两个代理都使用了相当多的 OOTB 配置,并且在我的 ActiveMQ 5 代理中也启用了 schedulerSupport。这是 activemq.xml:

中重新传送配置的样子
<redeliveryPlugin fallbackToDeadLetter="true" sendToDlqIfMaxRetriesExceeded="true">
   <redeliveryPolicyMap>
      <redeliveryPolicyMap>
         <defaultEntry>
            <redeliveryPolicy initialRedeliveryDelay="5000" maximumRedeliveries="9" redeliveryDelay="60000" /> 
         </defaultEntry>
      </redeliveryPolicyMap>
   </redeliveryPolicyMap>
</redeliveryPlugin>

还有一件事需要考虑:当我使用 Openwire (JMS) 而不是 AMQP 时,将应用 ActiveMQ 5 代理的重新传送策略。

ActiveMQ 5.x 中的 AMQP 协议头比 Artemis 代理实现的协议头要原始得多,并且可能不会对从 AMQP 客户端发回的配置做出正确的反应。此外,5.x 代理可以根据代理上 'transportConnector' 中的转换器设置做出不同的反应,该转换器可以是 JMSNATIVE[ 之一=20=] 或 RAWJMS 转换器将提供与 ActiveMQ 最兼容的行为,但需要在内部完全转换为 OpenWire 消息,然后在从 AMQP 发送方到 AMQP 接收方时返回到 AMQP,这会显着损害性能。 NATIVE 转换将尝试保留对消息重新传送状态的一些洞察力,但最有可能捕捉不到所有情况。使用 RAW 模式,根本无法了解消息传递计数,因此您绝对不会在代理端进行任何重新传递处理。

简而言之,如果您正在寻找功能齐全的 AMQP 代理,那么请选择 Artemis,因为它已经做了很多工作,如果您只需要可以让消息流动的东西,那么 5.x 应该可以,但不要'期待同样的服务质量。