AMQP 重新投递策略

AMQP redelivery policy

我将 Apache Camel AMQP 组件与 Azure 服务总线结合使用。我想添加一个重新传递策略,因为它可以为 ActiveMQ 做:

private void addRedeliveryPolicy(ActiveMQConnectionFactory factory) {
    RedeliveryPolicy policy = factory.getRedeliveryPolicy();
    policy.setMaximumRedeliveries(5);
    policy.setMaximumRedeliveryDelay(10000);
    policy.setInitialRedeliveryDelay(10);
    policy.setRedeliveryDelay(30);
}

如果 AMQPComponent 在重新传送策略中存在单个 getter:

private void addRedeliveryPolicy(JmsConnectionFactory factory) {
    JmsRedeliveryPolicy defaultCallbackRedeliveryPolicy = factory.getRedeliveryPolicy();
    factory.getRedeliveryPolicy().getMaxRedeliveries(...);
}

使用标准的 AMQP 和 Qpid 库。问题 - 如何将重新传送功能设置为:redeliveryDalay、redeliveryAttempts,用于 AMQP 组件?

Camel 的 ActiveMQ 组件使用特定于 ActiveMQ 的 OpenWire JMS 客户端实现。它使用未标准化的 OpenWire 协议。它实现了通过其 RedeliveryPolicy 对象配置的基于特定客户端的重新传递功能。

Camel 的 AMQP 组件使用 Qpid AMQP 客户端,它可以与任何 AMQP 代理、客户端、路由器等进行互操作,并且必须遵守 AMQP 规范。它有一个 接口 (即 JmsRedeliveryPolicy),你显然必须实现它来配置重新传递。参见 this example。实施您的政策后,只需在 JmsConnectionFactory.

上调用 setRedeliveryPolicy()

这里要记住的要点是,这两个实现是 100% 独立的,因此您可以在一个上配置的内容不一定在另一个上可用。目前 ActiveMQ 5.x RedeliveryPolicy 比 Qpid JmsRedeliveryPolicy.

有更多的选项

请记住,在许多(如果不是大多数)情况下,可以在 broker 上配置复杂的重新传递语义,因此如果有您想要的配置元素在 Qpid 上不可用JmsRedeliveryPolicy 我建议您看看您正在使用的任何经纪商,因为您可能会在那里找到等效的选项。

AMQP JMS 客户端不支持与 Openwire JMS 客户端相同的配置选项。这样做的主要原因是,与 Openwire 客户端不同,重新传送不会在 AMQP JMS 客户端本地发生,而是将消息释放回代理以进行重新分发。这意味着任何延迟处理或其他机制都需要在代理端而不是客户端完成。

客户端中当前的唯一选项是最大重新传递选项,它基于作为消息传输的一部分跟踪的 AMQP 传递计数应用。