消费者取消通知
概述
当通道从队列中消费时,有多种原因可能导致消费停止。 其中之一显然是客户端在同一通道上发出 basic.cancel
,这将导致消费者被取消,并且服务器回复 basic.cancel-ok
。 其他事件,例如队列被删除,或者在集群场景中,队列所在的节点发生故障,将导致消费被取消,但客户端通道不会被通知,这通常是没有帮助的。
为了解决这个问题,我们引入了一个扩展,在这种扩展中,对于此类意外的消费者取消,代理将向客户端发送 basic.cancel
。 这不会在代理收到来自客户端的 basic.cancel
的情况下发送。 AMQP 0-9-1 客户端默认情况下不期望从代理异步接收 basic.cancel
方法,因此为了启用此行为,客户端必须在其 client-properties
中提供一个 capabilities
表,其中有一个键 consumer_cancel_notify
和一个布尔值 true
。 有关详细信息,请参阅关于功能的章节。
我们支持的客户端默认情况下向代理提供此功能,因此代理将向它们发送异步 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
。
消费者取消和复制队列
支持消费者取消通知的客户端将始终在队列被删除或变得不可用时收到通知。 消费者可以请求在复制队列的领导者更改时应取消它们。