pika详解(二) BlockingConnection

BlockingConnection提供了最通用的连接方式

提供两个类: BlockingConnection 和 BlockingChannel

  1. class BlockingConnection(object):
  2. def __init__(self, parameters=None, _impl_class=None):
  3. ...
 

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连接参数

类主要的函数方法及说明:

  1. class BlockingConnection(object):
  2. def __init__(self, parameters=None, _impl_class=None):
  3. """Create a new instance of the Connection object.
  4. :param None | pika.connection.Parameters | sequence parameters:
  5. Connection parameters instance or non-empty sequence of them. If
  6. None, a `pika.connection.Parameters` instance will be created with
  7. default settings. See `pika.AMQPConnectionWorkflow` for more
  8. details about multiple parameter configurations and retries.
  9. :param _impl_class: for tests/debugging only; implementation class;
  10. None=default
  11. :raises RuntimeError:
  12. """
  13. def add_on_connection_blocked_callback(self, callback):
  14. 回调以便在连接被阻塞(从RabbitMQ接收到Connection.Blocked)时收到通知,
  15. 在这种状态下,RabbitMQ暂停处理传入数据,直到连接被解除阻塞,
  16. 因此接收此通知的发布者暂停发布直到连接被解除阻塞, 可以调用
  17. ConnectionParameters.blocked_connection_timeout 添加超时
  18. def add_on_connection_unblocked_callback(self, callback):
  19. 回调,以便在连接被解除阻塞时收到通知
  20. def call_later(self, delay, callback):
  21. pass
  22. def add_callback_threadsafe(self, callback):
  23. """
  24. connection.add_callback_threadsafe(
  25. functools.partial(channel.basic_ack, delivery_tag=...))
  26. """
  27. 回调
  28. def remove_timeout(self, timeout_id):
  29. 移除超时
  30. def close(self, reply_code=200, reply_text='Normal shutdown'):
  31. reply_codeint - 关闭的代码
  32. reply_textstr - 关闭的文本原因
  33. def process_data_events(self, time_limit=0):
  34. pass
  35. def sleep(self, duration):
  36. 延迟
  37. def channel(self, channel_number=None):
  38. 建立channel通道 channel_number 整数 要使用的通道编号,默认为下一个可用通道编号
  39. @property
  40. def is_closed(self):
  41. 返回bool
  42. @property
  43. def is_open(self):
  44. 返回bool
  45. @property
  46. def basic_nack_supported(self):
  47. 返回bool 指定服务器是否支持活动连接上的basic.nack
  48. @property
  49. def consumer_cancel_notify_supported(self):
  50. 返回bool 服务器是否支持活动连接上的使用者取消通知
  51. @property
  52. def exchange_exchange_bindings_supported(self):
  53. 返回bool 活动连接是否支持交换以交换绑定
  54. @property
  55. def publisher_confirms_supported(self):
  56. 返回bool 活动连接是否可以使用发布者确认
 

BlockingChannel 通道

创建示例

  1. import pika
  2. # Create our connection object
  3. connection = pika.BlockingConnection()
  4. # The returned object will be a synchronous channel
  5. channel = connection.channel()
 

参数:

  1. class BlockingChannel(object):
  2. def __init__(self, channel_impl, connection):
  3. pass
 
  1. @property
  2. def channel_number(self):
  3. """Channel number"""
  4. 频道号码
  1. @property
  2. def connection(self):
  3. """The channel's BlockingConnection instance"""
 
  1. @property
  2. def is_closed(self):
  3. 是否关闭, 返回bool
 
  1. @property
  2. def is_open(self):
  3. 通道是否开启, 返回bool
 
  1. def close(self, reply_code=0, reply_text="Normal shutdown"):
  2. 关闭
 
  1. def flow(self, active):
  2. 关闭和打开通道流量控制。 activebool - 打开流程(True)或关闭(False
 
  1. def add_on_cancel_callback(self, callback):
  2. 一个回调函数,该函数将在代理发送Basic.Cancel时调用
  3. callback -:callbackmethod_frame)其中method_frame类型
  4. pika.frame.Method类型的方法spec.Basic.Cancel
 
  1. def add_on_return_callback(self, callback):
  2. 回调函数,该函数将在发布的消息被拒绝并由服务器通过Basic.Return返回时调用
  3. callbackcallable - 使用callbackchannelmethodpropertiesbody),
  4. 其中channelpika.Channel方法:
  5. pika.spec.Basic.Return属性:pika.spec.BasicProperties bodybytes
 
  1. def basic_consume(self,queue, on_message_callback, auto_ack=False,
  2. exclusive=False, consumer_tag=None, arguments=None):
  3. queuestr - 要使用的队列
  4. on_message_callback(可调用) -用于将消息分派给用户的必需函数,定义:
  5. on_message_callbackchannel methodpropertiesbody
  6. channelBlockingChannel方法:spec.Basic.Deliver属性:
  7. spec.BasicProperties bodybytes
  8. auto_ackbool - 如果设置为True,将使用自动确认模式。
  9. exclusivebool - 不允许队列中的其他消费者
  10. consumer_tagstr - 您可以指定自己的消费者标签; 如果留空,将自动生成消费者标签
  11. argumentsdict - 消费者的自定义键/值对参数
 

  1. def basic_cancel(self, consumer_tag):
  2. 取消消费者
 
  1. def start_consuming(self):
  2. 处理I / O事件并调度计时器和basic_consume 回调,直到取消所有使用者
 
  1. def stop_consuming(self, consumer_tag=None):
  2. 取消所有使用者
 
  • 1
  • 2
  1. def consume(self,queue,auto_ack=False,exclusive=False, arguments=None,
  2. inactivity_timeout=None):
  3. 阻止队列消耗而不是通过回调。此方法是一个生成器,
  4. 它将每条消息都生成为方法,属性和正文的元组。当客户通过BlockingChannel.cancel()
  5. 或代理取消使用者时,活动生成器迭代器终止。
  6. 参数:
  7. queuestr - 要使用的队列名称
  8. auto_ackbool - 告诉代理不要期待ack / nack响应
  9. exclusivebool - 不允许队列中的其他消费者
  10. argumentsdict - 消费者的自定义键/值对参数
  11. inactivity_timeoutfloat - 如果给出一个数字(以秒为单位),将导致该方法在给定的
  12. 不活动时间后产生(NoneNoneNone); 这允许用户在等待消息到达时执行伪常规维护活动。
  13. 如果给出 None(默认),则该方法将阻塞,直到下一个事件到达
 
  1. def get_waiting_message_count(self):
  2. 返回可以通过BlockingChannel.consume从当前队列使用者生成器检索而不阻塞的消息数
 
  1. def cancel(self):
 
  1. def basic_ack(self, delivery_tag=0, multiple=False):
  2. 确认一条或多条消息。当客户端发送时,此方法确认通过DeliverGet-Ok方法传递的一条或多条消息。
  3. 当由服务器发送时,此方法确认在确认模式下在通道上使用“发布”方法发布的一条或多条消息。
  4. 确认可以是针对单个消息或一组消息,包括特定消息。
  5. 参数:
  6. delivery-tagint - 服务器分配的传递标记
  7. multiplebool - 如果设置为True,则将传递标记视为“最多并包含”,
  8. 以便可以使用单个方法确认多个消息。
  9. 如果设置为False,则传递标记引用单个邮件。如果多个字段为1,并且传递标记为零,
  10. 则表示确认所有未完成的消息。
 
  1. def basic_nack(self, delivery_tag=None, multiple=False, requeue=True):
  2. 方法允许客户端拒绝一个或多个传入消息。它可用于中断和取消大量传入消息,
  3. 或将无法处理的消息返回到其原始队列。
  4. 参数:
  5. delivery-tagint - 服务器分配的传递标记
  6. multiplebool - 如果设置为True,则将传递标记视为“最多并包含”,
  7. 以便可以使用单个方法确认多个消息。
  8. 如果设置为False,则传递标记引用单个邮件。如果多个字段为1,并且传递标记为零,
  9. 则表示确认所有未完成的消息。
  10. requeuebool - 如果requeuetrue,服务器将尝试重新排队该消息。
  11. 如果requeuefalse或重新排队尝试失败,则丢弃或删除消息。
 
  1. def basic_get(self, queue, auto_ack=False):
  2. AMQP代理获取单个消息
  3. 参数:
  4. queuestr - 从中​​获取消息的队列名称
  5. auto_ackbool - 告诉经纪人不要期待回复
 
  1. def basic_publish(self,exchange, routing_key, body, properties=None, mandatory=False):
  2. 参数:
  3. exchangestr - 要发布的交流
  4. routing_keystr - 要绑定的路由键
  5. body(字节) - 消息体; 如果没有身体,空字符串
  6. propertiespika.spec.BasicProperties - 消息属性
  7. mandatorybool - 强制性标志
 
  1. def basic_qos(self, prefetch_size=0, prefetch_count=0, global_qos=False):
  2. 指定服务质量
  3. 参数:
  4. prefetch_sizeint - 该字段指定预取窗口大小。如果服务器的大小等于或小于可用的
  5. 预取大小(并且也属于其他预取限制),则它将提前发送消息。
  6. 可以设置为零,意味着“没有特定限制”,
  7. 尽管其他预取限制可能仍然适用。如果在使用者中设置了no-ack选项,则忽略prefetch-size
  8. prefetch_countint - 根据整个消息指定预取窗口。该字段可以与预取大小字段结合使用;
  9. 如果预取窗口(以及通道和连接级别的窗口)都允许,则只会提前发送消息。
  10. 如果在使用者中设置了no-ack选项,则忽略prefetch-count
  11. global_qosbool - QoS是否适用于频道上的所有消费者
 
  1. def basic_recover(self, requeue=False):
  2. 此方法要求服务器重新传送指定通道上的所有未确认消息。可以重新传递零个或多个消息。
  3. 此方法替换异步Recover
 
  1. def basic_reject(self, delivery_tag=None, requeue=True):
  2. 拒绝传入的消息。此方法允许客户端拒绝邮件。它可用于中断和取消大量传入消息,
  3. 或将无法处理的消息返回到其原始队列。
  4. 参数:
  5. delivery-tagint - 服务器分配的传递标记
  6. requeuebool - 如果requeuetrue,服务器将尝试重新排队该消息。
  7. 如果requeuefalse或重新排队尝试失败,则丢弃或删除消息。
 
  1. def confirm_delivery(self):
  2. 启用RabbitMQ专有的确认模式
 
  1. def exchange_declare(self,exchange,exchange_type='direct',passive=False,
  2. durable=False,auto_delete=False,internal=False,arguments=None):
  3. 声明交换机
  4. exchangestr - 交换名称由这些字符的非空序列组成:
  5. 字母,数字,连字符,下划线,句点或冒号。
  6. exchange_typestr - 要使用的交换类型
  7. passivebool - 执行声明或只是检查它是否存在
  8. durablebool - 重启RabbitMQ
  9. auto_deletebool - 当不再绑定队列时删除
  10. internal(布尔) - 只能由其他交易所发布
  11. argumentsdict - 交换的自定义键/值对参数
 
  1. def exchange_delete(self, exchange=None, if_unused=False):
  2. 交换机删除
 
  1. def exchange_bind(self, destination, source, routing_key='',arguments=None):
  2. 交换机绑定
  3. destinationstr - 要绑定的目标交换
  4. sourcestr - 要绑定的源交换
  5. routing_keystr - 要绑定的路由键
  6. argumentsdict - 绑定的自定义键/值对参数
 

  1. def exchange_unbind(self,destination=None,source=None,routing_key='',
  2. arguments=None):
  3. 取消绑定
 
  1. def queue_declare(self,queue, passive=False, durable=False, exclusive=False,
  2. auto_delete=False, arguments=None):
  3. 声明队列,
  4. queuestr - 队列名称; 如果为空字符串,则代理将创建唯一的队列名称
  5. passivebool - 只检查队列是否存在,如果不存在则引发 ChannelClosed
  6. durablebool - 经纪人重新开始
  7. exclusivebool - 仅允许当前连接访问
  8. auto_deletebool - 消费者取消或断开连接后删除
  9. argumentsdict - 队列的自定义键/值参数
 
  1. def queue_delete(self, queue, if_unused=False, if_empty=False):
  2. 删除队列
 
  1. def queue_purge(self, queue):
  2. 清除指定队列中的所有消息 queue清除的队列的名称
 
  1. def queue_bind(self, queue, exchange, routing_key=None, arguments=None):
  2. 将队列绑定到指定的交换
  3. 参数:
  4. queuestr - 绑定到交换的队列
  5. exchangestr - 要绑定的源交换
  6. routing_keystr - 要绑定的路由键
  7. argumentsdict - 绑定的自定义键/值对参数
 
  1. def queue_unbind(self,queue,exchange=None,routing_key=None,arguments=None):
  2. 从交换中取消绑定队列
  3. queuestr - 从交换中取消绑定的队列
  4. exchangestr - 要绑定的源交换
  5. routing_keystr - 解除绑定的路由键
  6. argumentsdict - 绑定的自定义键/值对参数
 
  1. def tx_select(self):
  2. 选择标准交易模式
  3. def tx_commit(self):
  4. 事务提交
  5. def tx_rollback(self):
  6. 事务回滚
 
 

pika详解(二) BlockingConnection的更多相关文章

  1. pika详解 (一)

    pika详解 (一) 本文链接:https://blog.csdn.net/comprel/article/details/94592316 pika pika处理消息可以简单分为以下几个步骤: 我们 ...

  2. .NET DLL 保护措施详解(二)关于性能的测试

    先说结果: 加了缓存的结果与C#原生代码差异不大了 我对三种方式进行了测试: 第一种,每次调用均动态编译 第二种,缓存编译好的对象 第三种,直接调用原生C#代码 .net dll保护系列 ------ ...

  3. PopUpWindow使用详解(二)——进阶及答疑

      相关文章:1.<PopUpWindow使用详解(一)——基本使用>2.<PopUpWindow使用详解(二)——进阶及答疑> 上篇为大家基本讲述了有关PopupWindow ...

  4. Android 布局学习之——Layout(布局)详解二(常见布局和布局参数)

    [Android布局学习系列]   1.Android 布局学习之——Layout(布局)详解一   2.Android 布局学习之——Layout(布局)详解二(常见布局和布局参数)   3.And ...

  5. logback -- 配置详解 -- 二 -- <appender>

    附: logback.xml实例 logback -- 配置详解 -- 一 -- <configuration>及子节点 logback -- 配置详解 -- 二 -- <appen ...

  6. 爬虫入门之urllib库详解(二)

    爬虫入门之urllib库详解(二) 1 urllib模块 urllib模块是一个运用于URL的包 urllib.request用于访问和读取URLS urllib.error包括了所有urllib.r ...

  7. [转]文件IO详解(二)---文件描述符(fd)和inode号的关系

    原文:https://www.cnblogs.com/frank-yxs/p/5925563.html 文件IO详解(二)---文件描述符(fd)和inode号的关系 ---------------- ...

  8. Android View 的绘制流程之 Layout 和 Draw 过程详解 (二)

    View 的绘制系列文章: Android View 的绘制流程之 Measure 过程详解 (一) Android View 绘制流程之 DecorView 与 ViewRootImpl 在上一篇  ...

  9. HTTPS详解二:SSL / TLS 工作原理和详细握手过程

    HTTPS 详解一:附带最精美详尽的 HTTPS 原理图 HTTPS详解二:SSL / TLS 工作原理和详细握手过程 在上篇文章HTTPS详解一中,我已经为大家介绍了 HTTPS 的详细原理和通信流 ...

随机推荐

  1. .Net之静态资源

    介绍 静态文件都存储在Core Web根目录中.默认目录是<content_root>/wwwroot,但可通过 UseWebRoot方法更改访问目录.而content_root是指web ...

  2. 0-0 Linux安装在VMvare虚拟机上

    一.安装VMware虚拟机: 双击, 上面一步会提示你输入密钥,你只要双击这个,复制里面的一串码粘贴进去就可以. 点击完成,至此VM虚拟机安装完成. 二.在VMvare虚拟机上安装centos. 1. ...

  3. 【Nacos】Springboot整合Nacos配置中心(二) 多环境配置

    本篇随笔接上一篇文章:Springboot整合Nacos配置中心(一),主要记录Nacos多环境的配置的方法 Nacos多环境的配置 方法一: 1.在项目中的bootstrap.yaml文件中配置激活 ...

  4. dedecms发布文章排序按发布时间,不是更新时间

    织梦DEDECMS5.7这个版本存在一个问题,修改文章的同时也修改了文章的发布时间,这种情况下,如果我们调用最新文章时使用按"发布日期排序",就会打乱原来我们网站上的文章的顺序. ...

  5. python 第三方库大全

    Python 作为程序员的宠儿,越来越得到人们的关注,使用 Python 进行应用程序开发的越来也多.那么,在 2013 年有哪些流行的 Python 项目呢?下面,我们一起来看下. https:// ...

  6. Python脚本破解压缩文件口令(zipfile)

    环境:Windows python版本2.7.15 Python中操作zip压缩文件的模块是 zipfile . 相关文章:Python中zipfile压缩文件模块的使用 我们破解压缩文件的口令也是用 ...

  7. 网站指纹识别工具Whatweb的使用

    目录 whatweb 一些常见的Whatweb的扫描 常规扫描 批量扫描 详细回显扫描 扫描强度等级控制 快速本地扫描(扫描内网的主机) 将扫描结果导出至文件内 whatweb whatweb 是ka ...

  8. Windows核心编程 第七章 线程的调度、优先级和亲缘性(上)

    第7章 线程的调度.优先级和亲缘性 抢占式操作系统必须使用某种算法来确定哪些线程应该在何时调度和运行多长时间.本章将要介绍Microsoft Windows 98和Windows 2000使用的一些算 ...

  9. Linux系统调用表

    Linux系统调用表 记录下来,免得到处找 32位 int 0x80 %eax Name Source %ebx %ecx %edx %esx %edi 1 sys_exit kernel/exit. ...

  10. C++ primer plus读书笔记——第17章 输入、输出和文件

    第17章 输入.输出和文件 1. 对键盘进行输入缓冲可以让用户在将输入传输给程序之前返回并更正.C++程序通常在用户按下回车键时刷新输入缓冲区. 2. 一些I/O类 streambuf类为缓冲区提供了 ...