Blocked Connection Notifications
Overview
It is sometimes desirable for clients to receive a notification when their connection gets blocked due to the broker running low on resources (memory or disk).
We have introduced an AMQP 0-9-1 protocol extension in which the
broker sends to the client a connection.blocked
method when the connection gets blocked, and connection.unblocked when it is unblocked.
To receive these notifications, the client must present a
capabilities table in its client-properties in which there is a key
connection.blocked and a boolean value true.
See the capabilities section for further
details on this. Our supported clients indicate this capability
by default and provide a way to register handlers for the
connection.blocked and connection.unblocked methods.
When Notifications are Sent
A connection.blocked notification is sent to
publishing connections the first time RabbitMQ is low on a
resource. For example, when a RabbitMQ node detects that it
is low on RAM, it sends
connection.blocked to all connected publishing
clients supporting this feature. If before the connections
are unblocked the node also starts running low on disk space,
another connection.blocked will not be sent.
A connection.unblocked is sent when all
resource alarms have cleared and the connection is fully
unblocked.
Using Blocked Connection Notifications with Java Client
With the official Java client, blocked connection
notifications are handled by BlockedListener
interface implementations. They can be registered on a
Connection using the
Connection.addBlockedListener method:
ConnectionFactory factory = new ConnectionFactory();
Connection connection = factory.newConnection();
connection.addBlockedListener(new BlockedListener() {
public void handleBlocked(String reason) throws IOException {
// Connection is now blocked
}
public void handleUnblocked() throws IOException {
// Connection is now unblocked
}
});
Using Blocked Connection Notifications with .NET Client
With the official .NET client, blocked connection
notifications can be received by registering for the
ConnectionBlocked and ConnectionUnblocked events in IConnection:
public void HandleBlocked(object sender, ConnectionBlockedEventArgs args)
{
// Connection is now blocked
}
public void HandleUnblocked(object sender, EventArgs args)
{
// Connection is now unblocked
}
Conn.ConnectionBlocked += HandleBlocked;
Conn.ConnectionUnblocked += HandleUnblocked;