python使用rabbitmq实例五,路由键模糊匹配
来源:互联网 发布:mac os x 重装 超慢 编辑:程序博客网 时间:2024/05/23 19:47
上一篇说了路由键的功能,通过设置路由键,可以将消息发送到相应的队列,这里的路由键是要完全匹配,比如info消息的只能发到路由键为info的消息队列。
路由键模糊匹配,就是可以使用正则表达式,和常用的正则表示式不同,这里的话“#”表示所有、全部的意思;“*”只匹配到一个词。看完示例就能明白了。
这边继上一篇,还是用send.py和receive.py来实现路由键模糊匹配的功能。send.py表示发送端,receive.py表示接收端。实例的功能大概是这样:比如你有个知心好朋友,不管开心、伤心、工作上的还是生活上的事情都可以和她说;还有一些朋友可以分享开心的事情;还有一些朋友,你可以把不开心的事情和她说。
send.py代码分析
因为要进行路由键模糊匹配,所以交换机的类型要设置为topic,设置为topic,就可以使用#,*的匹配符号了。
#!/usr/bin/env python
#coding=utf8
import
pika
connection
=
pika.BlockingConnection(pika.ConnectionParameters(
'localhost'
))
channel
=
connection.channel()
#定义交换机,设置类型为topic
channel.exchange_declare(exchange
=
'messages'
,
type
=
'topic'
)
#定义路由键
routings
=
[
'happy.work'
,
'happy.life'
,
'sad.work'
,
'sad.life'
]
#将消息依次发送到交换机,并设定路由键
for
routing
in
routings:
message
=
'%s message.'
%
routing
channel.basic_publish(exchange
=
'messages'
,
routing_key
=
routing,
body
=
message)
print
message
connection.close()
上例中定义了四种类型的消息,容易理解,就不解释了,然后依次发送出去。
receive.py代码分析
同样,交换机的类型要设定为topic就可以了。从命令行接收参数的功能稍微调整了一下,就是没有参数时报错退出。
#!/usr/bin/env python
#coding=utf8
import
pika, sys
connection
=
pika.BlockingConnection(pika.ConnectionParameters(
'localhost'
))
channel
=
connection.channel()
#定义交换机,设置类型为topic
channel.exchange_declare(exchange
=
'messages'
,
type
=
'topic'
)
#从命令行获取路由参数,如果没有,则报错退出
routings
=
sys.argv[
1
:]
if
not
routings:
print
>> sys.stderr,
"Usage: %s [routing_key]..."
%
(sys.argv[
0
],)
exit()
#生成临时队列,并绑定到交换机上,设置路由键
result
=
channel.queue_declare(exclusive
=
True
)
queue_name
=
result.method.queue
for
routing
in
routings:
channel.queue_bind(exchange
=
'messages'
,
queue
=
queue_name,
routing_key
=
routing)
def
callback(ch, method, properties, body):
print
" [x] Received %r"
%
(body,)
channel.basic_consume(callback, queue
=
queue_name, no_ack
=
True
)
print
' [*] Waiting for messages. To exit press CTRL+C'
channel.start_consuming()
打开四个终端,一个运行如下,表示任何事情都可以和她说:
python receive.py "#"
另外一个终端 运行如下,表示可以和她分享开心的事:
python receive.py "happy.*"
第三个运行如下,表示工作上的事情可以和她分享:
python receive.py "*.work"
最后一个运行python send.py。结果不难想象出来,就不贴出来了。
参考文章:http://www.rabbitmq.com/tutorials/tutorial-five-python.html
在参考文章的最后面有提到几个难点,笔者自己做了测试,供大家参考:
1、发送信息时,如果不设置路由键,那么路由键设置为”*”的接收端是否能接收到消息?
发送信息时,如果不设置路由键,默认是表示广播出去,理论上所有接收端都可以收到消息,但是笔者试了下,路由键设置为"*"的接收端收不到任何消息。只有发送消息时,设置路由键为一个词,路由键设置为"*"的接收端才能收到消息。在这里,每个词使用"."符号分开的。
2、发送消息时,如果路由键设置为”..”,那么路由键设置为”#.*”的接收端是否能接收到消息?如果发送消息时,路由键设置为一个词呢?
两种情况,笔者都测试过了,可以的。
3、”a.*.#” 和”a.#”的区别
"a.#"只要字符串开头的一个词是a就可以了,比如a、a.haha、a.haha.haha。而这样的词是不行的,如abs、abc、abc.haha。"a.*.#"必须要满足a.*的字符串才可以,比如a.、a.haha、a.haha.haha。而这样的词是不行的,如a。
弄完上面的这些个问题,笔者觉着有些钻牛角尖了,不过既然官方有提出来,就钻一回吧。
- python使用rabbitmq实例五,路由键模糊匹配
- python使用rabbitmq实例五,路由键模糊匹配
- python使用rabbitmq实例五,路由键模糊匹配(5)
- python使用rabbitmq实例四,路由键
- python使用rabbitmq实例四,路由键
- python使用rabbitmq实例四,路由键(4)
- RabbitMQ(五):消息路由
- python使用rabbitmq实例二,工作队列
- python使用rabbitmq实例三,交换机
- python使用rabbitmq实例二,工作队列
- python使用rabbitmq实例三,交换机
- python 模糊匹配
- 使用Python完成公司名称和地址的模糊匹配
- rabbitMQ学习笔记(五) 消息路由
- rabbitMQ学习笔记(五) 消息路由
- RabbitMQ案例五之Routing路由功能
- RabbitMQ(五)—路由选择
- python结合rabbitmq实例
- C++11中的变参模板的使用
- Java GC及堆内存
- stl容器算法迭代器三大概念入门
- 关于eclipse标题栏乱码
- 使用集成式Activity快速开发
- python使用rabbitmq实例五,路由键模糊匹配
- linux设备驱动归纳总结
- flex弹性盒子布局
- python使用rabbitmq实例六,远程结果返回
- bzoj2738 矩阵乘法
- ElasticSearch增加Mapping字段
- 在windows下安装mongoDB并且添加进windows服务
- Docker 入门实践
- 生产者,消费者问题