rabbitmq 初探
速食版
启动服务端
- docker-compose脚本
version: '3.9' # cmd: docker run -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3.9-management rabbitmq: image: rabbitmq:3.9-management container_name: rabbitmq ports: - 5672:5672 - 15672:15672
- 执行
docker-compsoe up rabbitmq
启动
上下文
- 建立连接:
connection = pika.BlockingConnection(pika.ConnectionParameters('host.docker.internal'))
- 初始化频道:
channel = connection.channel()
- 关闭连接:
connection.close()
行为
- 创建队列:
channel.queue_declare(queue='hello')
- 消息入队
channel.basic_publish(exchange='', routing_key='hello', body='Hello World!')
- 消息出队
# 队列回调函数, 将 接收到的消息 输出到控制台 def callback(ch, method, properties, body): print(" [x] Received %r" % body) # 为队列配置监听方式, 即: 当队列中有数据的时候, 调用回调函数 channel.basic_consume(queue='hello', on_message_callback=callback, auto_ack=True)
启动服务端
- 官方教程
- 官方没有给出 docker-compose 脚本, 那么我就自己搞一个
docker-compose 启动
- 官方命令:
docker run -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3.9-management
- docker-compose脚本
version: '3.9' # cmd: docker run -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3.9-management rabbitmq: image: rabbitmq:3.9-management container_name: rabbitmq ports: - 5672:5672 - 15672:15672
- 执行
docker-compsoe up rabbitmq
启动
跑一下
- 官方教程
- 繁琐的文字大家使用 google 翻译自行查看
使用 python
初始化环境
- 安装pip包: pika,
pip install pika
- PS: 官方给出的是:
python -m pip install pika --upgrade
, 但是使用该命令不但很慢,而且会失败。
连接测试
- 将如下代码加入
send.py
中#!/usr/bin/python3 import pika # 初始化链接 # PS: 因为我这里是在 docker for mac 环境中运行的, host.docker.internal 代表本机 # PS2: 如果不理解上一句, 则无关紧要, 将下面的 host.docker.internal 替换为 localhost 即可 connection = pika.BlockingConnection(pika.ConnectionParameters('host.docker.internal')) # 获取 channel, 应该是频道的意思 channel = connection.channel()
- 运行
chmod +x send.py
赋予send.py
执行权限, 后面就可以使用./send.py
直接执行 python 脚本 - 运行
./send.py
未报错, 则表示链接成功
发送消息
- 根据官方文档, 补充代码, 此时
send.py
则如下#!/usr/bin/python3 import pika # 初始化链接 # PS: 因为我这里是在 docker for mac 环境中运行的, host.docker.internal 代表本机 # PS2: 如果不理解上一句, 则无关紧要, 将下面的 host.docker.internal 替换为 localhost 即可 connection = pika.BlockingConnection(pika.ConnectionParameters('host.docker.internal')) # 获取 channel, 应该是频道的意思 channel = connection.channel() # 创建一个队列, declare 意思是创建 channel.queue_declare(queue='hello') # 将 "Hello World!" 推送到 名为 "hell" 的 队列 channel.basic_publish(exchange='', routing_key='hello', body='Hello World!') # 输出内容, 一般 [ ] xxx, 表示 xxx 未完成, 而 [x] xxx 则表示 xxx 已完成 # 这里输出该内容表示 已经将 "Hello World!" 发送。 print(" [x] Sent 'Hello World!'") # 关闭连接 connection.close()
- 运行
./send.py
得到如下输出, 则表示消息入队成功[x] Sent 'Hello World!'
接收消息
- 根据官方文档, 将如下代码写入
receive.py
文件#!/usr/bin/python3 import pika, sys, os def main(): # 这里写为 host.docker.internal 的原因查看 send.py connection = pika.BlockingConnection(pika.ConnectionParameters(host='host.docker.internal')) channel = connection.channel() # 创建一个名为 "hello" 的 队列 channel.queue_declare(queue='hello') # 队列回调函数, 将 接收到的消息 输出到控制台 def callback(ch, method, properties, body): print(" [x] Received %r" % body) # 为队列配置监听方式, 即: 当队列中有数据的时候, 调用回调函数 channel.basic_consume(queue='hello', on_message_callback=callback, auto_ack=True) # 输出信息, 告诉调用者使用 "ctrl+c" 快捷键停止监听 print(' [*] Waiting for messages. To exit press CTRL+C') # 开始监听队列 channel.start_consuming() if __name__ == '__main__': """启动 main 函数 当按下 ctrl+c 后停止运行 """ try: main() except KeyboardInterrupt: print('Interrupted') try: sys.exit(0) except SystemExit: os._exit(0)
- 执行
chmod +x receive.py
为receive.py
赋予执行权限, 方便后面调用 - 执行
./receive.py
可以得到如下输出[*] Waiting for messages. To exit press CTRL+C [x] Received b'Hello World!'
输出解读
[*] Waiting for messages. To exit press CTRL+C
是 print 的内容[x] Received b'Hello World!'
是回调函数输出的内容, 看到此输出, 表示已经从 rabbitmq 的队列中读取到了数据
发送&&接收
- 运行
./receive.py
开始接收消息(PS: 如果之前已经运行了还没有关闭, 那就可以不运行) - 新建命令行运行
./send.py
- 仔细观察, 可以发现 每次运行
./send.py
, 都可以在./receive.py
中看到一个[x] Received b'Hello World!'
的输出 - 自此, 已经初步掌握了 rabbit 的
入队
,出队
的操作