• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
MC_Hotdog
Yeah, you're right I'm still riding that crappy bike
博客园    首页    新随笔    联系   管理    订阅  订阅

RabbitMQ之Routing(路由有选择的接收)

创建绑定方式  

1 channel.queue_bind(exchange="交换器的名字",
2                   queue="队列的名字")

绑定使用路由参数(主要避免basic_publish参数混淆)

1 channel.queue_bind(exchange="交换器的名字",
2                     queue="队列的名字",
3                     routing_key="black")

直接交换

  在消息发布与订阅中,消息广播给所有在线的消费者,假如说有时候我们只需要接收严重错误的日志报告写到磁盘中,之前使用的fanout交换,并没有带来太大的灵活性

  此时就可以使用直接交换:思想绑定密钥与路由密钥完全匹配的队列才能发收消息

 

 多重绑定

  用相同的绑定密钥绑定多个队列

 

但在这里官方是将每种严重性创建一个新的绑定关系

 send_log_direct.py

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 
 4 import pika
 5 import sys
 6 
 7 credentials = pika.PlainCredentials('admin', 'admin123456')
 8 connection = pika.BlockingConnection(pika.ConnectionParameters(host='192.168.1.6', credentials=credentials))
 9 channel = connection.channel()
10 # 申明交换器名以及类型
11 channel.exchange_declare(exchange='direct_logs', exchange_type='direct')
12 # 日志严重级别
13 severity = sys.argv[1] if len(sys.argv) > 1 else 'info'
14 message = ' '.join(sys.argv[2:]) or 'Hello World!'
15 channel.basic_publish(
16     exchange='direct_logs', routing_key=severity, body=message)
17 print(" [x] Sent %r:%r" % (severity, message))
18 connection.close()

receive_log_direct.py

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 
 4 import pika
 5 import sys
 6 
 7 credentials = pika.PlainCredentials('admin', 'admin123456')
 8 connection = pika.BlockingConnection(pika.ConnectionParameters(host='192.168.1.6', credentials=credentials))
 9 channel = connection.channel()
10 
11 channel.exchange_declare(exchange='direct_logs', exchange_type='direct')
12 
13 result = channel.queue_declare(queue='', exclusive=True)
14 queue_name = result.method.queue
15 
16 severities = sys.argv[1:]
17 if not severities:
18     sys.stderr.write("Usage: %s [info] [warning] [error]\n" % sys.argv[0])
19     sys.exit(1)
20 
21 for severity in severities:
22     channel.queue_bind(
23         exchange='direct_logs', queue=queue_name, routing_key=severity)
24 
25 print(' [*] Waiting for logs. To exit press CTRL+C')
26 
27 
28 def callback(ch, method, properties, body):
29     print(" [x] %r:%r" % (method.routing_key, body))
30 
31 
32 channel.basic_consume(
33     queue=queue_name, on_message_callback=callback, auto_ack=True)
34 
35 channel.start_consuming()

 

posted @ 2019-09-26 20:16  MC_Hotdog  阅读(382)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3