阻塞连接通知
概述
有时,当连接由于代理(Broker)资源(内存或磁盘)不足而被阻塞时,客户端希望能够收到通知。
AMQP 0-9-1 协议引入了一个扩展,使代理能够在连接被阻塞或解除阻塞时通知客户端。当连接被阻塞时,代理会发送一个 connection.blocked 方法;当连接解除阻塞时,会发送一个 connection.unblocked 方法。
为了接收这些通知,客户端必须在其 client-properties 中的 capabilities 表里包含一个键为 connection.blocked 且布尔值为 true 的条目。
有关此内容的更多详细信息,请参阅功能(capabilities)章节。受支持的客户端默认会声明此功能,并提供注册 connection.blocked 和 connection.unblocked 方法处理程序的机制。
何时发送通知
当 RabbitMQ 首次出现资源不足时,会向发布连接发送 connection.blocked 通知。例如,当 RabbitMQ 节点检测到内存不足时,它会向所有支持此功能且已连接的发布客户端发送 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;