JAVA 消息确认机制之 ACK 模式
CLIENT_ACKNOWLEDGE : 客户端手动确认, 这就意味着 AcitveMQ 将不会 "自作主张" 的为你 ACK 任何消息, 开发者需要自己择机确认. 在此模式下, 开发者需要需要关注几个方法: 1) message.acknowledge(),2) ActiveMQMessageConsumer.acknowledege(),3) ActiveMQSession.acknowledge(); 其 1)和 3)是等效的, 将当前 session 中所有 consumer 中尚未 ACK 的消息都一起确认, 2)只会对当前 consumer 中那些尚未确认的消息进行确认. 开发者可以在合适的时机必须调用一次上述方法. 为了避免混乱, 对于这种 ACK 模式下, 建议一个 session 下只有一个 consumer.
我们通常会在基于 Group(消息分组)情况下会使用 CLIENT_ACKNOWLEDGE, 我们将在一个 group 的消息序列接受完毕之后确认消息(组); 不过当你认为消息很重要, 只有当消息被正确处理之后才能确认时, 也可以使用此模式 .
如果开发者忘记调用 acknowledge 方法, 将会导致当 consumer 重启后, 会接受到重复消息, 因为对于 broker 而言, 那些尚未真正 ACK 的消息被视为 "未消费".
开发者可以在当前消息处理成功之后, 立即调用 message.acknowledge()方法来 "逐个" 确认消息, 这样可以尽可能的减少因网络故障而导致消息重发的个数; 当然也可以处理多条消息之后, 间歇性的调用 acknowledge 方法来一次确认多条消息, 减少 ack 的次数来提升 consumer 的效率, 不过这仍然是一个利弊权衡的问题.
除了 message.acknowledge()方法之外, ActiveMQMessageConumser.acknowledge()和 ActiveMQSession.acknowledge()也可以确认消息, 只