使用oslo模块编写的rpc server无法消费消息问题
来源:互联网 发布:mac怎么移动桌面图标 编辑:程序博客网 时间:2024/06/06 21:05
messaging.get_rpc_server对应的代码为oslo_messaging/rpc/server.py中的get_rpc_server方法,该方法返回RPCServer类对象实例。
RPCServer的类定义如下:
class RPCServer(msg_server.MessageHandlingServer)而msg_server.MessageHandlingServer对应的类为oslo_messaging/server.py中的MessageHandlingServe类,所有消息的处理都会走_on_incoming这个方法,这个方法会调用self._work_executor.submit方法,
而self._work_executor是在MessageHandlingServe类的__init__方法中初始化的,存在如下语句:mgr = driver.DriverManager('oslo.messaging.executors', self.executor_type)
那么oslo.messaging.executors这个namespace又对应到哪里呢??发现oslo_messaging目录下根本就不存在executors这个目录或者文件(之前版本的oslo.messaging是存在这个目录的,比如1.4.1版本),再次查找,在/usr/lib/python2.7/site-packages/oslo.messaging-5.17.1.dist-info/的entry_points.txt中存在如下内容:
[oslo.messaging.executors]blocking = futurist:SynchronousExecutoreventlet = futurist:GreenThreadPoolExecutorthreading = futurist:ThreadPoolExecutor
那么对于上面不同的self.executor_type,就对应到futurist这个模块的不同类。。因为我的server端代码中messaging.get_rpc_server传入的参数executor值为eventlet,所以就走到了futurist/_futures.py中的GreenThreadPoolExecutor类。该类的submit方法最终会调用到_spin_up这个方法,而这个方法最终走到self._pool.spawn_n(_green.GreenWorker(work, self._delayed_work))这条语句。
这里的self._pool为eventlet.greenpool.GreenPool类实例对象,而_green.GreenWorker即为futurist/_green.py中的GreenWorker类,该类实现了__call__方法,可直接调用。但是self._pool.spawn_n(_green.GreenWorker(work, self._delayed_work))中GreenWorker类的__call__方法无法被调用,应该改成如下:
self._pool.spawn_n(_green.GreenWorker(work, self._delayed_work)())
改成这个样子后,rpc server就可正常处理消息了。。
但是不明白的事是openstack M/N这些版本中为啥没有出问题呢。。。
以下是相关模块版本及环境信息:
oslo.concurrency (3.18.0)oslo.config (3.22.0)oslo.context (2.12.1)oslo.i18n (3.12.0)oslo.log (3.20.1)oslo.messaging (5.17.1)oslo.middleware (3.23.1)oslo.serialization (2.16.0)oslo.service (1.19.0)oslo.utils (3.22.0)
futurist (0.20.0)
eventlet (0.20.1)
所有的模块都是通过pip安装的。
操作系统为centos7,python为2.7.5,rabbitmq-server版本为rabbitmq-server-3.5.6-1.noarch
0 0
- 使用oslo模块编写的rpc server无法消费消息问题
- 使用oslo相关模块构造rpc server及client代码样例
- oslo.config模块的使用
- openstack的RPC消息通信,oslo.messagin实现
- 使用oslo.config模块不能正确获取配置项值的问题排查
- kafka无法消费消息
- RocketMQ消息重复消费的问题
- JMS无法消费消息原因:
- RPC in oslo.messaging
- 关于android下无法使用iap继续购买消费型道具的问题
- 使用SOAP RPC 消息
- activeMQ消费消息时网络流量异常大的问题
- activeMQ消费消息时网络流量异常大的问题
- activeMQ消费消息时网络流量异常大的问题
- activeMQ消费消息时网络流量异常大的问题 .
- Openstack oslo.message rpc简介
- openstack的公共库(oslo)的使用
- openstack的公共库(oslo)的使用
- 字段太长,无法录入数据库
- linux下使用yum安装mysql
- [我眼中的C#]正则表达式
- 从机器学习谈起(机器学习简介)
- 第一次用SVN遇到的问题
- 使用oslo模块编写的rpc server无法消费消息问题
- 隐式意图
- 大规模敏捷框架SAFe版本4与版本3区别
- 如何从正确的原理图生成PCB图
- [leetcode] 515. Find Largest Value in Each Tree Row
- Apache 文件下载
- 所谓ajax异步请求
- c++ <vector> push_back初始化问题
- modsecurity设置规则防止SQL注入