BlockingConnection提供了最通用的连接方式
提供两个类: BlockingConnection 和 BlockingChannel
class BlockingConnection(object):
def __init__(self, parameters=None, _impl_class=None):
...
BlockingConnection是在pika异步的基础上提供的阻塞方法, 调用的是 AMQP协议的 Basic.Deliver and Basic.Return
在使用basic_consume接收消息, 使用basic_publish发送消息的时候仍然可以实现异步
为防止递归调用或者阻塞, blocking连接/channel 在上下文切换中实现 队列的asynchronously-delivered事件(异步通知事件), 比如在等待BlockingConnection.channel或 BlockingChannel.queue_declare时, 一旦实现嵌套的上下文, 将会同步(synchronously)调用它们, 这涉及到所有的回调函数:
1.lockingConnection.add_on_connection_blocked_callback,
2.BlockingConnection.add_on_connection_unblocked_callback, 3.BlockingChannel.basic_consume 等
避免死锁, 一直夯住: 但rabbitmq资源不足的时候, 当去连接rabbitmq的时候, rabbitmq会告诉客户端Connection.Blocked, 然后rabbitmq会暂停处理连接,直到有资源分配进行处理, 这会影响BlockingConnection和BlockingChannel
比如用户在basic_publish 使用非发布确认机制下, 遇上rabbitmq暂停处理连接,将会一直阻塞住,用户回调也不会被执行, 可能引起系统宕机, 解决办法是:
在BlockingConnection初始化时配置blocked_connection_timeout连接参数
类主要的函数方法及说明:
class BlockingConnection(object):
def __init__(self, parameters=None, _impl_class=None):
"""Create a new instance of the Connection object.
:param None | pika.connection.Parameters | sequence parameters:
Connection parameters instance or non-empty sequence of them. If
None, a `pika.connection.Parameters` instance will be created with
default settings. See `pika.AMQPConnectionWorkflow` for more
details about multiple parameter configurations and retries.
:param _impl_class: for tests/debugging only; implementation class;
None=default
:raises RuntimeError:
"""
def add_on_connection_blocked_callback(self, callback):
回调以便在连接被阻塞(从RabbitMQ接收到Connection.Blocked)时收到通知,
在这种状态下,RabbitMQ暂停处理传入数据,直到连接被解除阻塞,
因此接收此通知的发布者暂停发布直到连接被解除阻塞, 可以调用
ConnectionParameters.blocked_connection_timeout 添加超时
def add_on_connection_unblocked_callback(self, callback):
回调,以便在连接被解除阻塞时收到通知
def call_later(self, delay, callback):
pass
def add_callback_threadsafe(se