flask实现使用装饰器完成rabbitmq消费队列
? 在python中最常使用的rabbitmq库应该是pika,但是一般使用pika时都是一个py文件为一个消费者,需要全部手动启动。那么如何做到像java的Springboot一样可以直接使用注解完成消费者队列的监听,这里使用到的一个第三方库是flask_rabbitmq。
1、安装并简单使用flask_rabbitmq库
添加库跟普通的库什么区别
命令:pip install flask_rabbitmq
安装完成后,可以去pushyzheng/flask-rabbitmq: A simple Python Flask combined with RabbitMQ pika library (github.com)中的example/consumer文件夹下查看例子具体怎么使用
在flask大致的使用过程:
- 创建一个和app目录的目录结构一样包,包括init.py和demo.py(可以复制过来再修改文件名)
- 在config.py配置rabbitmq地址和账号密码
- 在同级的app/demo进行队列的配置和消费之代码的编写
- 最后启动run.py就可以了
2、根据自己的需要修改源码
以上仅仅只是最简单是使用,可以根据自己的业务场景和需要修改源码,这里我看了一下源码,因为比较简单,所以我对源码进行了一些修改,具体修改了一下地方
1、将RabbitMQ.py的run和run_with_flask_app注释
因为项目中不只是集成rabbitmq,还有其他工具,因此为了确保所有的配置都能够在run.py下配置,将这两个启动方法注释(不注释也可以,总之不要调用这个启动函数)
RabbitMQ.py run.py 2、RabbitMQ.py注释run函数的self._channel.queue_declare(queue=queue_name, auto_delete=True)这一行代码
由于我的队列一开始就创建好了,这里只需要充当消费者,所以在初始化的时候,并不需要创建队列,否则会报错。 3、最后我在RabbitMQ.py的类中添加了应答函数
我发现示例中并没有应答,处理完消息之后队列中会出现 Unacked,因此自己添加了个应答调用的函数
def basic_ack(self, delivery_tag):
self._channel.basic_ack(delivery_tag)
使用示例:
from message_queue import mq, queue
@queue(queue="sum_queue")
def sum_queue(ch, method, props, body):
print("sum_queue => {}".format(body))
mq.basic_ack(delivery_tag=method.delivery_tag)
当然,应答方式有改变也可以根据实际情况进行修改
最后:修改源码的方式并不建议直接在原库修改,pycharm可以在Lib/site-packages下将其复制出来在项目中再进行修改,否则换个环境就不起作用了。
|