交换机模式主要包括:交换机之发布订阅、交换机之关键字和交换机之通配符。

1、交换机之发布订阅

发布订阅和简单的消息队列区别在于,发布订阅会将消息发送给所有的订阅者,而消息队列中的数据被消费一次便消失。所以,RabbitMQ实现发布和订阅时,会为每一个订阅者创建一个队列,而发布者发布消息时,会将消息放置在所有相关队列中。

生产者模式:

示例代码:

import pika# 1.连接rabbit
connection = pika.BlockingConnection(pika.ConnectionParameters('192.168.124.104'))
channel = connection.channel()# 2.声明一个名为logs类型的fanout的交换机
channel.exchange_declare(exchange='logs', exchange_type='fanout')  # 发布订阅模式参数# 3.向logs交换机中插入数据:"Hello world"
message = 'info:Hello World!'
channel.basic_publish(exchange='logs',routing_key='',body=message,properties=pika.BasicProperties(delivery_mode=2,  # make message persistent))
print(" [x] Sent 'Hello World!'")

运行结果:

消费者模式:

示例代码:

import pika# 1.连接rabbit
connection = pika.BlockingConnection(pika.ConnectionParameters('192.168.124.104'))
channel = connection.channel()# 2.声明一个名为logs类型的fanout的交换机
channel.exchange_declare(exchange='logs', exchange_type='fanout')# 3.创建队列
result = channel.queue_declare("", exclusive=True)  # 随机生成一个队列名
queue_name = result.method.queue
print(queue_name)# 4.将指定队列绑定到交换机上
channel.queue_bind(exchange='logs', queue=queue_name)# 5.确定回调函数
def callback(ch, method, properties, body):print(" [x] Received %r" % body)ch.basic_ack(delivery_tag=method.delivery_tag)# 6.确定监听队列参数
channel.basic_consume(queue=queue_name,  # 指定队列auto_ack=False,  # 手动应答方式on_message_callback=callback)print(' [*] Waiting for messages. To exit press CTRL+C')
# 7.正式监听
channel.start_consuming()

运行结果:【将程序重复执行三次,三个消费者都收到了同样的消息】

2、交换机之关键字

生产者模式:

示例代码:  【将info分别改为warning、error运行】

import pika# 1.连接rabbit
connection = pika.BlockingConnection(pika.ConnectionParameters('192.168.124.104'))
channel = connection.channel()# 2.声明一个名为logs类型的direct的交换机
channel.exchange_declare(exchange='logs2', exchange_type='direct')  # 发布订阅模式参数# 3.向logs交换机中插入数据:"Hello world"
message = 'info:Hello World!'
channel.basic_publish(exchange='logs2',routing_key='info',  # info信息body=message,properties=pika.BasicProperties(delivery_mode=2,  # make message persistent))
print(" [x] Sent 'Hello World!'")

运行结果:

消费者模式:

示例代码1:

import pika# 1.连接rabbit
connection = pika.BlockingConnection(pika.ConnectionParameters('192.168.124.104'))
channel = connection.channel()# 2.声明一个名为logs类型的direct的交换机
channel.exchange_declare(exchange='logs2', exchange_type='direct')# 3.创建队列
result = channel.queue_declare("", exclusive=True)  # 随机生成一个队列名
queue_name = result.method.queue
print(queue_name)# 4.将指定队列绑定到交换机上
channel.queue_bind(exchange='logs2', queue=queue_name, routing_key='info')
channel.queue_bind(exchange='logs2', queue=queue_name, routing_key='waring')
channel.queue_bind(exchange='logs2', queue=queue_name, routing_key='error')# # 使用for循环将指定队列绑定到交换机上
# for key in ['info', 'waring', 'error']:
#     channel.queue_bind(exchange='logs2', queue=queue_name, routing_key=key)# 5.确定回调函数
def callback(ch, method, properties, body):print(" [x] Received %r" % body)ch.basic_ack(delivery_tag=method.delivery_tag)# 6.确定监听队列参数
channel.basic_consume(queue=queue_name,  # 指定队列auto_ack=False,  # 手动应答方式on_message_callback=callback)print(' [*] Waiting for messages. To exit press CTRL+C')
# 7.正式监听
channel.start_consuming()

运行结果:

示例代码2:

import pika# 1.连接rabbit
connection = pika.BlockingConnection(pika.ConnectionParameters('192.168.124.104'))
channel = connection.channel()# 2.声明一个名为logs类型的direct的交换机
channel.exchange_declare(exchange='logs2', exchange_type='direct')# 3.创建队列
result = channel.queue_declare("", exclusive=True)  # 随机生成一个队列名
queue_name = result.method.queue
print(queue_name)# 4.将指定队列绑定到交换机上
channel.queue_bind(exchange='logs2', queue=queue_name, routing_key='info')# # 使用for循环将指定队列绑定到交换机上
# for key in ['info', 'waring', 'error']:
#     channel.queue_bind(exchange='logs2', queue=queue_name, routing_key=key)# 5.确定回调函数
def callback(ch, method, properties, body):print(" [x] Received %r" % body)ch.basic_ack(delivery_tag=method.delivery_tag)# 6.确定监听队列参数
channel.basic_consume(queue=queue_name,  # 指定队列auto_ack=False,  # 手动应答方式on_message_callback=callback)print(' [*] Waiting for messages. To exit press CTRL+C')
# 7.正式监听
channel.start_consuming()

运行结果:

示例代码3:

import pika# 1.连接rabbit
connection = pika.BlockingConnection(pika.ConnectionParameters('192.168.124.104'))
channel = connection.channel()# 2.声明一个名为logs类型的direct的交换机
channel.exchange_declare(exchange='logs2', exchange_type='direct')# 3.创建队列
result = channel.queue_declare("", exclusive=True)  # 随机生成一个队列名
queue_name = result.method.queue
print(queue_name)# 4.将指定队列绑定到交换机上
channel.queue_bind(exchange='logs2', queue=queue_name, routing_key='error')# # 使用for循环将指定队列绑定到交换机上
# for key in ['info', 'waring', 'error']:
#     channel.queue_bind(exchange='logs2', queue=queue_name, routing_key=key)# 5.确定回调函数
def callback(ch, method, properties, body):print(" [x] Received %r" % body)ch.basic_ack(delivery_tag=method.delivery_tag)# 6.确定监听队列参数
channel.basic_consume(queue=queue_name,  # 指定队列auto_ack=False,  # 手动应答方式on_message_callback=callback)print(' [*] Waiting for messages. To exit press CTRL+C')
# 7.正式监听
channel.start_consuming()

运行结果:

3、交换机之通配符

通配符交换机”与之前的路由模式相比,它将信息的传输类型的key更加细化,以“key1.key2.keyN....”的模式来指定信息传输的key的大类型和大类型下面的小类型,让消费者可以更加精细的确认自己想要获取的信息类型。而在消费者一段,不用精确的指定具体到哪一个大类型下的小类型的key,而是可以使用类似正则表达式(但与正则表达式规则完全不同)的通配符在指定一定范围或符合某一个字符串匹配规则的key,来获取想要的信息。

“通配符交换机”(Topic Exchange)将路由键和某模式进行匹配。此时队列需要绑定在一个模式上。符号“#”匹配一个或多个词,符号“*”仅匹配一个词。因此“audit.#”能够匹配到“audit.irs.corporate”,但是“audit.*”只会匹配到“audit.irs”。(这里与一般的正则表达式的“*”和“#”刚好相反,这里我们需要注意一下。)

生产者模式:

示例代码:  【分别将routing_key改为usa.news、news.usa和usa.weather执行一遍】

import pika# 1.连接rabbit
connection = pika.BlockingConnection(pika.ConnectionParameters('192.168.124.104'))
channel = connection.channel()# 2.声明一个名为logs类型的topic的交换机
channel.exchange_declare(exchange='logs3', exchange_type='topic')  # 发布订阅模式参数# 3.向logs交换机中插入数据:"Hello world"
message = 'usa.news---------'
channel.basic_publish(exchange='logs3',routing_key='usa.news',  # usa.newsbody=message,properties=pika.BasicProperties(delivery_mode=2,  # make message persistent))
print(" [x] Sent 'Hello World!'")

运行结果:

消费者模式:

示例代码1:

import pika# 1.连接rabbit
connection = pika.BlockingConnection(pika.ConnectionParameters('192.168.124.104'))
channel = connection.channel()# 2.声明一个名为logs类型的topic的交换机
channel.exchange_declare(exchange='logs3', exchange_type='topic')# 3.创建队列
result = channel.queue_declare("", exclusive=True)  # 随机生成一个队列名
queue_name = result.method.queue
print(queue_name)# 4.将指定队列绑定到交换机上
channel.queue_bind(exchange='logs3', queue=queue_name, routing_key='news.#')# # 使用for循环将指定队列绑定到交换机上
# for key in ['info.#', 'waring.#', 'error.#']:
#     channel.queue_bind(exchange='logs2', queue=queue_name, routing_key=key)# 5.确定回调函数
def callback(ch, method, properties, body):print(" [x] Received %r" % body)ch.basic_ack(delivery_tag=method.delivery_tag)# 6.确定监听队列参数
channel.basic_consume(queue=queue_name,  # 指定队列auto_ack=False,  # 手动应答方式on_message_callback=callback)print(' [*] Waiting for messages. To exit press CTRL+C')
# 7.正式监听
channel.start_consuming()

运行结果:

示例代码2:

import pika# 1.连接rabbit
connection = pika.BlockingConnection(pika.ConnectionParameters('192.168.124.104'))
channel = connection.channel()# 2.声明一个名为logs类型的topic的交换机
channel.exchange_declare(exchange='logs3', exchange_type='topic')# 3.创建队列
result = channel.queue_declare("", exclusive=True)  # 随机生成一个队列名
queue_name = result.method.queue
print(queue_name)# 4.将指定队列绑定到交换机上
channel.queue_bind(exchange='logs3', queue=queue_name, routing_key='#.news')# # 使用for循环将指定队列绑定到交换机上
# for key in ['info.#', 'waring.#', 'error.#']:
#     channel.queue_bind(exchange='logs2', queue=queue_name, routing_key=key)# 5.确定回调函数
def callback(ch, method, properties, body):print(" [x] Received %r" % body)ch.basic_ack(delivery_tag=method.delivery_tag)# 6.确定监听队列参数
channel.basic_consume(queue=queue_name,  # 指定队列auto_ack=False,  # 手动应答方式on_message_callback=callback)print(' [*] Waiting for messages. To exit press CTRL+C')
# 7.正式监听
channel.start_consuming()

运行结果:

示例代码3:

import pika# 1.连接rabbit
connection = pika.BlockingConnection(pika.ConnectionParameters('192.168.124.104'))
channel = connection.channel()# 2.声明一个名为logs类型的topic的交换机
channel.exchange_declare(exchange='logs3', exchange_type='topic')# 3.创建队列
result = channel.queue_declare("", exclusive=True)  # 随机生成一个队列名
queue_name = result.method.queue
print(queue_name)# 4.将指定队列绑定到交换机上
channel.queue_bind(exchange='logs3', queue=queue_name, routing_key='#.weather')# # 使用for循环将指定队列绑定到交换机上
# for key in ['info.#', 'waring.#', 'error.#']:
#     channel.queue_bind(exchange='logs2', queue=queue_name, routing_key=key)# 5.确定回调函数
def callback(ch, method, properties, body):print(" [x] Received %r" % body)ch.basic_ack(delivery_tag=method.delivery_tag)# 6.确定监听队列参数
channel.basic_consume(queue=queue_name,  # 指定队列auto_ack=False,  # 手动应答方式on_message_callback=callback)print(' [*] Waiting for messages. To exit press CTRL+C')
# 7.正式监听
channel.start_consuming()

运行结果:

python使用pika库调用rabbitmq的交换机模式相关推荐

  1. python采用pika库使用rabbitmq总结,多篇笔记和示例

    这一段时间学习了下rabbitmq,在学习的过程中,发现国内关于python采用pika库使用rabbitmq的资料很少,官网有这方面的资料,不过是都英文的.于是笔者结合自己的理解,就这方面内容写了一 ...

  2. Python:使用ctypes库调用外部DLL 数据类型对应

    Python:使用ctypes库调用外部DLL(转) 前言

  3. Python:使用ctypes库调用外部DLL

    Python:使用ctypes库调用外部DLL 前言 朋友的公司是做GPS的,上周联系到我要帮做个程序把他们平台的车辆定位跟踪数据和省里的平台对接.看一下官方提供的三个文档,洋洋洒洒共一百多页,一大堆 ...

  4. RabbitMQ 入门系列(9)— Python 的 pika 库常用函数及参数说明

    1. pika.PlainCredentials(username, password, erase_on_connect) 功能:创建连接时的登录凭证 参数: username: MQ 账号 pas ...

  5. Python——OpenCV(opencv-python库)调用摄像头

    基本概念 OpenCV: OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux.Windows.Android和Mac OS操作系统上.它轻量级而且高效--由一系列 ...

  6. [小白向]Python使用request库调用API并获取返回的JSON数据包中的内容

    目录 对于参数可以直接写入链接中的接口(适用于参数较少时) 对于参数需要使用字典进行携带的接口(适用于请求头中参数较多时) 本文介绍了使用GET的方式调用API的方式,如需要使用POST方式,将代码中 ...

  7. python库_python使用ctypes库调用DLL动态链接库_python

    最近要使用python调用C++编译生成的DLL动态链接库,因此学习了一下ctypes库的基本使用. ctypes是一个用于Python的外部函数库,它提供C兼容的数据类型,并允许在DLL或共享库中调 ...

  8. python使用pika订阅rabbitmq消息链接被重置问题

    最近在做一个运维监控系统的时候,使用python的pika插件订阅rabbitmq消息,程序在运行一段时间后,总是会报链接被充值的错误,具体报错如下: Traceback (most recent c ...

  9. python调用dll函数指针_python使用ctypes库调用DLL动态链接库

    最近要使用python调用C++编译生成的DLL动态链接库,因此学习了一下ctypes库的基本使用. ctypes是一个用于Python的外部函数库,它提供C兼容的数据类型,并允许在DLL或共享库中调 ...

  10. python内置库之学习ctypes库(二)

    ctypes库踩坑日记2 一.自己实现一个dll文件,再用python的ctypes库调用思路1更清晰 二.生成dll文件 三.ctypes库调用 一.自己实现一个dll文件,再用python的cty ...

最新文章

  1. linux mysql 开启远程访问
  2. 代码错误信息,微信报错
  3. 自动化测试工具有哪些_软件测试工程师要具备哪些能力和技能?
  4. 建行参考码大全ybla_52度五粮液价格表大全 不同系列价钱盘点
  5. 干货报告:八大科技领域,280 页,InfoQ《2020 中国技术发展白皮书》开放下载...
  6. Linux root用户无法打开Chrome或则chromium(kali)
  7. 如何通过组件化提高开发效率?
  8. Visual Studio 2017 ASP.NET Core开发
  9. linux下三个时间与find命令
  10. mysql—数据库优化——如何选择合适的索引
  11. elementUI中登录页form表单重复跳转登陆页
  12. fifa15服务器位置,《FIFA 15》系统菜单界面图文详解 各游戏模式详解
  13. 多操作赋的语义判断(如 int *a和int* a)
  14. Android NDK开发(1)----- Java与C互相调用实例详解
  15. android镊 姩瀹夎 apk,用java寫的jodconverter借用openoffice來轉換office成pdf的示例代碼...
  16. 华为数通ensp命令(二)
  17. Pycharm安装包(类库)的方法总结及解决包下载慢的问题
  18. 2019年大龄程序员书单
  19. sis最新ip地址2020入口一_【新版教材】2020最新人教版高中历史教材必修一电子课本...
  20. 五十三、微信小程序云开发豆瓣电影小项目

热门文章

  1. 投资理财-基金基本术语概念整理
  2. et结波导口转换_UHF宽带同轴-矩形波导转换器新结构
  3. dmp文件导入 Oracle 步骤
  4. SpringBoot+PageHelper实现分页功能
  5. 天呐?发现一个媲美 “百度” 的程序员网站
  6. 日期对象(Date)操作 getMonth()方法
  7. 腾讯/网易/263/阿里云企业邮箱登录入口
  8. 嵌入式系统开发-麦子学院(5)——linux高级编程之文件IO管理
  9. 2016 知识点汇总 mindmap
  10. iOS APP之间到跳转,以及热门应用,手机自带到应用跳转