ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

rabbitmq 初探

2022-04-09 23:33:16  阅读:209  来源: 互联网

标签:pika py rabbitmq send 初探 docker channel


启动服务端

  • 官方教程
  • 官方没有给出 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.pyreceive.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 的 入队, 出队 的操作

标签:pika,py,rabbitmq,send,初探,docker,channel
来源: https://www.cnblogs.com/nianwu/p/16124232.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有