• python采用pika库使用rabbitmq(七)PublishSubscribe(消息发布订阅)


    之前的例子都基本都是1对1的消息发送和接收,即消息只能发送到指定的queue里,但有些时候你想让你的消息被所有的Queue收到,类似广播的效果,这时候就要用到exchange了,

    Exchange在定义的时候是有类型的,以决定到底是哪些Queue符合条件,可以接收消息


    fanout: 所有bind到此exchange的queue都可以接收消息
    direct: 通过routingKey和exchange决定的那个唯一的queue可以接收消息
    topic:所有符合routingKey(此时可以是一个表达式)的routingKey所bind的queue可以接收消息

       表达式符号说明:#代表一个或多个字符,*代表任何字符
          例:#.a会匹配a.a,aa.a,aaa.a等
              *.a会匹配a.a,b.a,c.a等
         注:使用RoutingKey为#,Exchange Type为topic的时候相当于使用fanout 

    headers: 通过headers 来决定把消息发给哪些queue

     1 import pika
     2 import sys
     3  
     4 connection = pika.BlockingConnection(pika.ConnectionParameters(
     5         host='localhost'))
     6 channel = connection.channel()
     7  
     8 channel.exchange_declare(exchange='logs',
     9                          type='fanout')
    10  
    11 message = ' '.join(sys.argv[1:]) or "info: Hello World!"
    12 channel.basic_publish(exchange='logs',
    13                       routing_key='',
    14                       body=message)
    15 print(" [x] Sent %r" % message)
    16 connection.close()
    publisher.py
     1 import pika
     2  
     3 connection = pika.BlockingConnection(pika.ConnectionParameters(
     4         host='localhost'))
     5 channel = connection.channel()
     6  
     7 channel.exchange_declare(exchange='logs',
     8                          type='fanout')
     9  
    10 result = channel.queue_declare(exclusive=True) #不指定queue名字,rabbit会随机分配一个名字,exclusive=True会在使用此queue的消费者断开后,自动将queue删除
    11 queue_name = result.method.queue
    12  
    13 channel.queue_bind(exchange='logs',
    14                    queue=queue_name)
    15  
    16 print(' [*] Waiting for logs. To exit press CTRL+C')
    17  
    18 def callback(ch, method, properties, body):
    19     print(" [x] %r" % body)
    20  
    21 channel.basic_consume(callback,
    22                       queue=queue_name,
    23                       no_ack=True)
    24  
    25 channel.start_consuming()
    subscriber
  • 相关阅读:
    菜根谭#245
    菜根谭#244
    菜根谭#243
    菜根谭#242
    菜根谭#241
    菜根谭#240
    菜根谭#239
    菜根谭#238
    菜根谭#237
    [转载]Linux 内核list_head 学习(一)
  • 原文地址:https://www.cnblogs.com/GodLv/p/9953616.html
Copyright © 2020-2023  润新知