python使用rabbitmq实例五,路由键模糊匹配(5)

上一篇说了路由键的功能,通过设置路由键,可以将消息发送到相应的队列,这里的路由键是要完全匹配,比如info消息的只能发到路由键为info的消息队列。

路由键模糊匹配,就是可以使用正则表达式,和常用的正则表示式不同,这里的话“#”表示所有、全部的意思;“*”只匹配到一个词。看完示例就能明白了。

这边继上一篇,还是用send.py和receive.py来实现路由键模糊匹配的功能。send.py表示发送端,receive.py表示接收端。实例的功能大概是这样:比如你有个知心好朋友,不管开心、伤心、工作上的还是生活上的事情都可以和她说;还有一些朋友可以分享开心的事情;还有一些朋友,你可以把不开心的事情和她说。

send.py代码分析

因为要进行路由键模糊匹配,所以交换机的类型要设置为topic,设置为topic,就可以使用#,*的匹配符号了。

1 #!/usr/bin/env python
2 #coding=utf8
3 import pika
4  
5 connection = pika.BlockingConnection(pika.ConnectionParameters(
6                'localhost'))
7 channel = connection.channel()
8  
9 #定义交换机,设置类型为topic
10 channel.exchange_declare(exchange='messages'type='topic')
11  
12 #定义路由键
13 routings = ['happy.work''happy.life''sad.work''sad.life']
14  
15 #将消息依次发送到交换机,并设定路由键
16 for routing in routings:
17     message = '%s message.' % routing
18     channel.basic_publish(exchange='messages',
19                           routing_key=routing,
20                           body=message)
21     print message
22  
23 connection.close()

上例中定义了四种类型的消息,容易理解,就不解释了,然后依次发送出去。

receive.py代码分析

同样,交换机的类型要设定为topic就可以了。从命令行接收参数的功能稍微调整了一下,就是没有参数时报错退出。

1 #!/usr/bin/env python
2 #coding=utf8
3 import pika, sys
4  
5 connection = pika.BlockingConnection(pika.ConnectionParameters(
6                'localhost'))
7 channel = connection.channel()
8  
9 #定义交换机,设置类型为topic
10 channel.exchange_declare(exchange='messages'type='topic')
11  
12 #从命令行获取路由参数,如果没有,则报错退出
13 routings = sys.argv[1:]
14 if not routings:
15     print >> sys.stderr, "Usage: %s [routing_key]..." % (sys.argv[0],)
16     exit()
17  
18 #生成临时队列,并绑定到交换机上,设置路由键
19 result = channel.queue_declare(exclusive=True)
20 queue_name = result.method.queue
21 for routing in routings:
22     channel.queue_bind(exchange='messages',
23                        queue=queue_name,
24                        routing_key=routing)
25  
26 def callback(ch, method, properties, body):
27     print " [x] Received %r" % (body,)
28  
29 channel.basic_consume(callback, queue=queue_name, no_ack=True)
30  
31 print ' [*] Waiting for messages. To exit press CTRL+C'
32 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。

弄完上面的这些个问题,笔者觉着有些钻牛角尖了,不过既然官方有提出来,就钻一回吧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python可以使用RabbitMQ作为面向消息的中间件来进行消息的生产和消费。我们可以通过连接RabbitMQ服务器并使用Python程序来发送消息和获取消息。可以使用封装了RabbitMQ类的代码来实现这些操作。这个类中封装了连接RabbitMQ服务器的方法、发送消息的方法和获取消息的方法。通过实例化这个类的对象并调用相关的方法,就可以实现消息的生产和消费操作。在正常情况下,消息队列中的消息会一直保存,但如果RabbitMQ挂掉,则消息队列中的消息会全部消失。可以通过使用rabbitmqctl命令的list_queues参数来查询RabbitMQ中的队列以及对应的消息个数。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [python程序使用RabbitMQ](https://blog.csdn.net/qq_60695343/article/details/126362800)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [pythonrabbitMQ使用](https://blog.csdn.net/jack_laoliu/article/details/98765173)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值