您的位置:首页 > 编程语言 > Python开发

RabbitMQ消息通信,一个生产者和多个消费者,广播式消息通信

2017-11-05 21:50 411 查看
上一则我们说到了一个对多个的RabbitMQ消息队列通信的实现方法,生产者发送的消息只能被一个消费者接收并处理,上则请阅读:http://blog.csdn.net/u012631731/article/details/78450389

本则说的是广播式的消息通信方法实现,所有的消费者都可以收到生产者发送的消息



还是直接上代码吧,有描述直接在代码里面注释:

client.py

#!/usr/bin/env python

import pika

import sys

#不解释

connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))

channel = connection.channel()

#这里是设置消息队列的一些属性,之前两则文章都没有设置exchange这个属性,直接赋值为空字符串

#这里需要描述的是,并不是生产者直接发送消息到消息队列里面,生产者把消息发送给了exchange,

#通过exchange再把消息发送给某一个或多个消息队列里面(queue),这里没有创建消息队列,因为这个事例是表达广播式消息队列,

#有一点需要说明一下,如果exchange属性设置为空,RabbitMQ就会采用默认的属性设置exchange,然后需要设置

#routing_key属性,指明所要发送的消息队列名称,这里设置exchange的名称为logs,类型属性为fanout,还有另外三个属性direct, topic, headers,后续再说明

channel.exchange_declare(exchange='logs',

                         exchange_type='fanout')

message = ' '.join(sys.argv[1:]) or "info: Hello World!"

#指定exchange的名称

channel.basic_publish(exchange='logs',

                      routing_key='',

                      body=message)

print(" [x] Sent %r" % message)

connection.close()

server.py

#!/usr/bin/env python

import pika

connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))

channel = connection.channel()

#创建exchange的名称为logs,指定类型为fanout

channel.exchange_declare(exchange='logs',

                         exchange_type='fanout')

#删除随机创建的消息队列

result = channel.queue_declare(exclusive=True)

queue_name = result.method.queue

channel.queue_bind(exchange='logs',

                   queue=queue_name)

print(' [*] Waiting for logs. To exit press CTRL+C')

def callback(ch, method, properties, body):

    print(" [x] %r" % body)

channel.basic_consume(callback,

                      queue=queue_name,

                      no_ack=True)

channel.start_consuming()

执行多个python server.py 和一个python client.py看看效果吧

更多信息请查询RabbitMQ官网:http://www.rabbitmq.com
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息