ActiveMQ 显示所有已确认的消息,尽管我只确认了一个
ActiveMQ shows all messages acknowledged although I have only acknowledged one
我创建了一个生产者,其交易 false
和 CLIENT_ACKNOWLEDGE
将 99 条消息放入队列。
我为具有不同会话的同一队列创建了一个消费者,并处理了 false
和 CLIENT_ACKNOWLEDGE
。
第一条消息我没有确认,剩下的98条消息我都确认了。
我打开了 ActiveMQ 管理控制台,预计会看到 1 条待处理的消息/队列中的 1 条消息,但令我惊讶的是,我看到所有 99 条消息都已出队。
谁能指出我错在哪里?
您看到的是 JMS 规范规定的预期行为。 JMS 1.1 规范中标题为 "Message Acknowledgment" 的第 4.4.11 节指出:
CLIENT_ACKNOWLEDGE - With this option, a client acknowledges a
message by calling the message’s acknowledge
method. Acknowledging a
consumed message automatically acknowledges the receipt of all messages
that have been delivered by its session. [emphasis added]
如果您使用的是 ActiveMQ 5.x,那么您可以使用 ActiveMQSession.INDIVIDUAL_ACKNOWLEDGE 模式,它是 JMS 规范之外的扩展。
我创建了一个生产者,其交易 false
和 CLIENT_ACKNOWLEDGE
将 99 条消息放入队列。
我为具有不同会话的同一队列创建了一个消费者,并处理了 false
和 CLIENT_ACKNOWLEDGE
。
第一条消息我没有确认,剩下的98条消息我都确认了。
我打开了 ActiveMQ 管理控制台,预计会看到 1 条待处理的消息/队列中的 1 条消息,但令我惊讶的是,我看到所有 99 条消息都已出队。
谁能指出我错在哪里?
您看到的是 JMS 规范规定的预期行为。 JMS 1.1 规范中标题为 "Message Acknowledgment" 的第 4.4.11 节指出:
CLIENT_ACKNOWLEDGE - With this option, a client acknowledges a message by calling the message’s
acknowledge
method. Acknowledging a consumed message automatically acknowledges the receipt of all messages that have been delivered by its session. [emphasis added]
如果您使用的是 ActiveMQ 5.x,那么您可以使用 ActiveMQSession.INDIVIDUAL_ACKNOWLEDGE 模式,它是 JMS 规范之外的扩展。