max-delivery-attempts 不适用于未确认的消息

max-delivery-attempts does not work for un-acknowledged messages

我注意到 Artemins 有奇怪的行为。我不确定这是错误还是我不明白。 我使用 Artemis Core API。我将 autoCommitAcks 设置为 false。我注意到如果在 MessageHandler 中收到消息但消息未被确认并且会话被回滚,则 Artemis 不会将此消息视为未送达,Artemis 认为此消息根本未发送给消费者。参数 max-delivery-attempts 在这种情况下不起作用。消息被重新传递了无数次。方法org.apache.activemq.artemis.api.core.client.ClientMessage#getDeliveryCountreturns每次1个。消息在 Web 控制台的 Redelivered 列中具有 false 值。如果消息在会话回滚之前得到确认,那么 max-delivery-attempts 可以正常工作。

消息确认的具体目的是什么?确认仅表示已收到该消息,还是确认已成功接收并处理该消息?也许我可以两种方式使用 acknowledge,这只取决于我的要求?

消息确认是指调用 org.apache.activemq.artemis.api.core.client.ClientMessage#acknowledge 方法。

您看到的行为是正常的。

核心客户端实际上使用来自 local 缓冲区的消息,该缓冲区异步填充来自代理的消息。此本地缓冲区中的消息数据量由客户端 URL 上设置的 consumerWindowSize 控制。代理可能会向位于这些本地缓冲区中的各种客户端发送数千条消息,并且消费者实际上 从未 以任何身份看到这些消息。这些消息被认为是正在传递并且对其他客户端不可用,但它们被认为是传递。只有当消息被确认时,才认为它已传递给客户端。

如果客户端是 auto-committing 确认,则确认消息会迅速将其从各自的队列中删除。一旦消息从队列中移除,它就不能再被重新传递,因为它不再存在于代理上。简而言之,如果您 auto-commit 确认,则无法获得可配置的重新传递语义。

但是,如果客户端 auto-committing 确认并且消费者关闭(出于任何原因)而不提交确认或调用 rollback() ClientSession 然后确认的消息将根据配置的重新传递语义(包括 max-delivery-attempts)重新传递。