跳至主内容
版本:4.2

消费者取消通知

概述

当一个通道正在从队列中消费时,有多种原因可能导致消费停止。其中之一显然是客户端在同一通道上发出 basic.cancel,这将导致消费者被取消,服务器会回复 basic.cancel-ok。其他事件,例如队列被删除,或者在集群环境中,队列所在的节点发生故障,都会导致消费被取消,但客户端通道不会收到通知,这通常是无益的。

为了解决这个问题,我们引入了一个扩展,在该扩展中,当发生此类意外的消费者取消时,代理会将 basic.cancel 发送给客户端。当代理收到来自客户端的 basic.cancel 时,不会发送此通知。AMQP 0-9-1 客户端默认不期望从代理异步接收 basic.cancel 方法,因此为了启用此行为,客户端必须在其 client-properties 中提供一个 capabilities 表,其中包含一个键 consumer_cancel_notify 和一个布尔值 true。有关详细信息,请参阅 capabilities 部分

我们支持的客户端默认向代理提供此功能,因此代理会向它们发送异步 basic.cancel 方法,然后它们会将其呈现给消费者回调。例如,在我们的 Java 客户端中,Consumer 接口有一个 handleCancel 回调,子类化 DefaultConsumer 类可以通过重写它来实现。

channel.queueDeclare(queue, false, true, false, null);
Consumer consumer = new DefaultConsumer(channel) {
@Override
public void handleCancel(String consumerTag) throws IOException {
// consumer has been cancelled unexpectedly
}
};
channel.basicConsume(queue, consumer);

客户端为已被意外取消(例如由于队列删除)的消费者发出 basic.cancel 并不算错误。根据定义,客户端发出 basic.cancel 和代理发出异步通知之间可能存在竞争条件。在这种情况下,代理在收到 basic.cancel 时不会报错,而是像往常一样回复 basic.cancel-ok

消费者取消和复制队列

支持消费者取消通知的客户端将始终在队列被删除或变得不可用时收到通知。消费者可以请求在复制队列的领导者更改时取消它们。

© . This site is unofficial and not affiliated with VMware.