RabbitMQ消息通信,生产者发送消息给指定的消费者的消息队列

来源:互联网 发布:epub制作软件安卓版 编辑:程序博客网 时间:2024/06/07 03:39

上一篇文章描述了,通过使用广播式的通信方式,让生产者把消息广播给每一个消费者,本节我们介绍另外一个方式,生产者可以指定消费者,把消息发送给它:

client.py

#!/usr/bin/env pythonimport pikaimport sysconnection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))channel = connection.channel()#这里指定exchange的名字为direct_log,类型为direct(直接的,指定的)channel.exchange_declare(exchange='direct_logs',                         exchange_type='direct')#在这里我们创建一个变量用于介绍routing_key的名字,#这样我们在发送消息的时候可以指定把消息发送给某一个消费者对应的消息队列#默认的消费者绑定的消息队列为infoseverity = sys.argv[1] if len(sys.argv) > 2 else 'info'message = ' '.join(sys.argv[2:]) or 'Hello World!'channel.basic_publish(exchange='direct_logs',                      routing_key=severity,                      body=message)print(" [x] Sent %r:%r" % (severity, message))connection.close()

server.py

#!/usr/bin/env pythonimport pikaimport sysconnection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))channel = connection.channel()#这里的exchange转换类型为direct(直接的,也可以理解为指定的)channel.exchange_declare(exchange='direct_logs',                         exchange_type='direct')result = channel.queue_declare(exclusive=True)queue_name = result.method.queue#这里设置需要从哪个消息队列里面获取消息,任意字符串即可#这里我们加入了提示,可以是info warning error也可以是其他的severities = sys.argv[1:]if not severities:    sys.stderr.write("Usage: %s [info] [warning] [error]\n" % sys.argv[0])    sys.exit(1)#这里指定exchange的名字为direct_log,与client相对应#指定routint_key为运行时指定的消息队列的名称for severity in severities:    channel.queue_bind(exchange='direct_logs',                       queue=queue_name,                       routing_key=severity)print(' [*] Waiting for logs. To exit press CTRL+C')def callback(ch, method, properties, body):    print(" [x] %r:%r" % (method.routing_key, body))channel.basic_consume(callback,                      queue=queue_name,                      no_ack=True)channel.start_consuming()
最后我们通过现象更加深入的了解这种通信方式:

在一个终端1运行python server.py info

在一个终端2运行python server.py warning

在一个终端3运行python server.py error

这样就会有三个消息队列,分别是info  warning  error,

然后执行python client.py info test_message 或python client.py test_message,这样终端1就会收到test_message消息

然后执行python client.py warning test_message,这样终端2就会收到test_message消息

然后执行python client.py error test_message,这样终端3就会收到test_message消息

更多信息请查询RabbitMQ官网:http://www.rabbitmq.com

阅读全文
0 0