连接阻塞通知
概述
有时客户端希望在由于代理资源(内存或磁盘)不足而导致其连接被阻塞时收到通知。
我们引入了一个 AMQP 0-9-1 协议扩展,其中代理在连接被阻塞时向客户端发送 connection.blocked
方法,并在连接解除阻塞时发送 connection.unblocked
方法。
要接收这些通知,客户端必须在其 client-properties
中提供一个 capabilities
表,其中包含一个键 connection.blocked
和一个布尔值 true
。
有关此内容的更多详细信息,请参阅功能部分。我们支持的客户端默认情况下指示此功能,并提供一种注册 connection.blocked
和 connection.unblocked
方法处理程序的方法。
何时发送通知
RabbitMQ 第一次资源不足时,会向发布连接发送 connection.blocked
通知。例如,当 RabbitMQ 节点检测到其 RAM 不足时,它会向所有支持此功能的已连接发布客户端发送 connection.blocked
。如果在连接解除阻塞之前,节点也开始磁盘空间不足,则不会发送另一个 connection.blocked
。
当所有资源警报都已清除并且连接已完全解除阻塞时,将发送 connection.unblocked
。
使用 Java 客户端的连接阻塞通知
使用官方 Java 客户端,连接阻塞通知由 BlockedListener
接口实现处理。可以使用 Connection.addBlockedListener
方法在 Connection
上注册它们。
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
}
});
使用 .NET 客户端的连接阻塞通知
使用官方 .NET 客户端,可以通过在 IConnection
中注册 ConnectionBlocked
和 ConnectionUnblocked
事件来接收连接阻塞通知。
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;