跳至主内容
版本:4.2

阻塞连接通知

概述

有时,客户端希望在因代理资源不足(内存或磁盘)而导致连接被阻塞时收到通知。

AMQP 0-9-1 协议已引入一项扩展,使代理能够通知客户端连接何时被阻塞或解除阻塞。当连接被阻塞时,代理会发送一个 connection.blocked 方法,当连接解除阻塞时,会发送一个 connection.unblocked 方法。

要接收这些通知,客户端必须在其 client-properties 中提供一个 capabilities 表,其中包含一个键 connection.blocked 和一个布尔值 true

有关更多详细信息,请参阅capabilities 部分。支持此功能的客户端默认会声明此功能,并提供注册 connection.blockedconnection.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 中注册 ConnectionBlockedConnectionUnblocked 事件来接收连接阻塞通知。

  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;
© . This site is unofficial and not affiliated with VMware.