pika 的坑

霸气de小男生 提交于 2019-11-30 05:08:42

 

之前只是用celery, 这次用一下pika

参考rabbitMQ官网的python版,https://www.rabbitmq.com/tutorials/tutorial-one-python.html

没想到各种坑.

如果说rabbitMQ官网是为了让新人入门,所以刻意忽略掉细节, 那么必须吐槽pika的官方文档, 很不好.远不如celery

 

1 Stream connection lost: BrokenPipeError(32, 'Broken pipe')

使用pika 的BlockingConnection

但启动后不久, 作为publish的生产端就会掉线:

raise self._closed_result.value.error
pika.exceptions.StreamLostError: Stream connection lost: BrokenPipeError(32, 'Broken pipe')

根据https://www.cnblogs.com/zhaof/p/9774390.html

是要在连接时设置心跳为0,就不会超时自动下线了, 否则RabbitMQ服务器会发过来默认值580

#--------------rabbitMQ------------------
import pika

connection = pika.BlockingConnection(
    pika.ConnectionParameters(
    host='localhost',
    heartbeat=0, #never exit after start
    ))

channel = connection.channel()


channel.queue_declare(queue='update_sql')

 

这个错误在测试消费端时没测出来,因为测试使用的发布者和官方文档里一样,发完就下线退出了. 这样当然看不出这个心跳问题.

但是联调时就暴露了. 真无语.

 

2  content_type

默认的body是二进制的. 然后消费端要

body.decode('utf-8')
 
结果忽然发现 官方代码示例里这么写
    channel.basic_publish('exchange_name',
                          'routing_key',
                          'Test Message',
                          pika.BasicProperties(content_type='text/plain',
                                               type='example'))

这似乎时可以发文本的吗?

然后,看见别人还可以这么写https://blog.csdn.net/fzlulee/article/details/98480724

        self.channel.basic_publish(exchange=exchange, routing_key=routing_key, body=message,properties=pika.BasicProperties(delivery_mode=2,message_id=message_id,content_type="application/json"))

 

似乎就是html请求头常见的写法了? 但是pika里没有对BasicProperties的详细文档,

,源码里也看不出注释https://pika.readthedocs.io/en/stable/_modules/pika/spec.html#BasicProperties

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!