Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1788937
  • 博文数量: 335
  • 博客积分: 4690
  • 博客等级: 上校
  • 技术积分: 4341
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-08 21:38
个人简介

无聊之人--除了技术,还是技术,你懂得

文章分类

全部博文(335)

文章存档

2016年(29)

2015年(18)

2014年(7)

2013年(86)

2012年(90)

2011年(105)

分类: Python/Ruby

2012-12-14 14:43:47

上一篇博文我们队exchange的direct type进行了测试,但是用户的需求总是在变化,上述在对消息进行路由的时候
通过message的basic_publish  routing_key参数是否匹配queue_bind的routing_key来决定消息到deliver到
那一个queue。
但是当用户的两个key不能够完全枚举的时候我们该怎么办呢,
dev1_info
dev2_info
...
dev1_warning
dev2_warning
...
dev1_error
dev1_error
...
这时候,通过直接bind,
看起来就不在可行?那该怎么办?这时候topic就要隆重出场了
exchange是通过支持模式来实现功能增强的。其中
* (star) can substitute for exactly one word.
# (hash) can substitute for zero or more words.
这样在bind的时候我们可以有更多的选择
如下的消息模式".."
Q1 is bound with binding key "*.orange.*" 
and Q2 with "*.*.rabbit" 
Q1 is interested in all the orange animals.
Q2 wants to hear everything about rabbits, and everything about lazy animals.

点击(此处)折叠或打开

  1. #!/usr/bin/env python
  2. import pika
  3. import sys

  4. connection = pika.BlockingConnection(pika.ConnectionParameters(
  5.         host='localhost'))
  6. channel = connection.channel()

  7. channel.exchange_declare(exchange='topic_logs',
  8.                          type='topic')

  9. routing_key = sys.argv[1] if len(sys.argv) > 1 else 'anonymous.info'
  10. message = ' '.join(sys.argv[2:]) or 'Hello World!'
  11. channel.basic_publish(exchange='topic_logs',
  12.                       routing_key=routing_key,
  13.                       body=message)
  14. print " [x] Sent %r:%r" % (routing_key, message)
  15. connection.close()

点击(此处)折叠或打开

  1. #!/usr/bin/env python
  2. import pika
  3. import sys

  4. connection = pika.BlockingConnection(pika.ConnectionParameters(
  5.         host='localhost'))
  6. channel = connection.channel()

  7. channel.exchange_declare(exchange='topic_logs',
  8.                          type='topic')

  9. result = channel.queue_declare(exclusive=True)
  10. queue_name = result.method.queue

  11. binding_keys = sys.argv[1:]
  12. if not binding_keys:
  13.     print >> sys.stderr, "Usage: %s [binding_key]..." % (sys.argv[0],)
  14.     sys.exit(1)

  15. for binding_key in binding_keys:
  16.     channel.queue_bind(exchange='topic_logs',
  17.                        queue=queue_name,
  18.                        routing_key=binding_key)

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

  20. def callback(ch, method, properties, body):
  21.     print " [x] %r:%r" % (method.routing_key, body,)

  22. channel.basic_consume(callback,
  23.                       queue=queue_name,
  24.                       no_ack=True)

  25. channel.start_consuming()


CONSOLE 1
H:\mq>topic_send.py  "kern.critical" "A critical kernel error"
 [x] Sent 'kern.critical':'A critical kernel error'
CONSOLE2

H:\mq>topic_receiver.py "#"
 [*] Waiting for logs. To exit press CTRL+C
 [x] 'kern.critical':'A critical kernel error'

CONSOLE3
H:\mq>topic_receiver.py   "*.critical"
 [*] Waiting for logs. To exit press CTRL+C
 [x] 'kern.critical':'A critical kernel error'
CONSOLE 4 
H:\mq>topic_receiver.py  "kern.*"
 [*] Waiting for logs. To exit press CTRL+C
 [x] 'kern.critical':'A critical kernel error'
 可以看到的通过不同的bind方式,我们可以对自己感兴趣的消息进行bind,并rout到不同的message  queue。
 REF:
阅读(1417) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~