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.
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.
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 } });
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;