Consumer Cancel Notification
Overview
When a channel is consuming from a queue, there are various
reasons which could cause the consumption to stop. One of
these is obviously if the client issues a
basic.cancel
on the same channel, which will
cause the consumer to be cancelled and the server replies
with a basic.cancel-ok
. Other events, such as
the queue being deleted, or in a clustered scenario, the
node on which the queue is located failing, will cause the
consumption to be cancelled, but the client channel will not
be informed, which is frequently unhelpful.
To solve this, we have introduced an extension in which the
broker will send to the client a basic.cancel
in the case of such unexpected consumer cancellations. This
is not sent in the case of the broker receiving a
basic.cancel
from the client. AMQP 0-9-1
clients don't by default expect to receive
basic.cancel
methods from the broker
asynchronously, and so in order to enable this behaviour,
the client must present a capabilities
table in
its client-properties
in which there is a key
consumer_cancel_notify
and a boolean value
true
. See the section on capabilities for details.
Our supported clients present this capability by default to
the broker and thus will be sent the asynchronous
basic.cancel
method by the broker, which they
present to the consumer callback. For example, in our Java
client, the Consumer
interface has a
handleCancel
callback, which can be overridden
by sub-classing the DefaultConsumer
class:
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);
It is not an error for the client to issue a
basic.cancel
for a consumer which has been
unexpectedly cancelled (e.g. due to queue deletion). By
definition, there is a race possible between a client
issuing a basic.cancel
, and the broker sending
out the asynchronous notification. In such cases, the broker
does not error when it receives the
basic.cancel
and replies with a
basic.cancel-ok
as normal.
Consumer Cancellation and Replicated Queues
Clients supporting consumer cancel notification will always be informed when a queue is deleted or becomes unavailable. Consumers may request that they should be cancelled when the leader of a replicated queue changes.