接着上一章,使用exchange_type='direct'进行消息传递。这样消息会完全匹配后发送到对应的接收端。现在我们想干这样一件事:

C1获取消息中包含:orange内容的消息,并且消息是由3个单词组成的。

C2获取消息中包含:rabbit内容的消息,并且也是3个单词组成,同时,包含lazy开头的消息,这个消息长度>2

在下图中,

quick.orange.rabbit:Q1 Q2都会收到

lazy.orange.elephant:Q1 Q2都会收到

quick.orange.fox :只会到Q1

lazy.brown.fox:只会到Q2

lazy.pink.rabbit:只会到Q2

quick.orange.male.rabbit:哪儿也去不了

lazy.orange.male.rabbit:只会到Q2

消息中的

*:代表一个单词

#:代表N个单词

那么,如何实现呢?

发送端:

import pika
import sys

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

#创建交换机和上一章一样。只是类型变为:exchange_type='topic'
channel.exchange_declare(exchange='topic_logs',
exchange_type='topic')

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

接收端:

import pika
import sys

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

#和发送端保持一致 注意:exchange_type='topic'
channel.exchange_declare(exchange='topic_logs',
exchange_type='topic')

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

binding_keys = sys.argv[1:]
if not binding_keys:
sys.stderr.write("Usage: %s [binding_key]...\n" % sys.argv[0])
sys.exit(1)

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

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()

注意:今天在这里遇到一个特别奇怪的问题。就是接收端程序执行到:

result = channel.queue_declare(exclusive=True)

陷入死循环。这时候应该怎么办呢?

把rabbitmq服务重启即可。本系列文章rabbitmq使用的是:3.6.12。

接下来,我们将讨论利用rabbitmq实现RPC

希望牛小妹能跟上步伐

Python操作rabbitmq系列(五):根据主题分配消息的更多相关文章

  1. Python操作rabbitmq系列(一)

    从本文开始,接下来的内容,我们将讨论rabbitmq的相关功能.我的这些文章,最终是要实现一个项目(具体是什么暂不透露).前面每一篇,都是在为这个系统做准备.rabbitmq,是我们这个项目的关键部分 ...

  2. Python操作rabbitmq系列(六):进行RPC调用

    此刻,我们已经进入第6章,是官方的最后一个环节,但是,并非本系列的最后一个环节.因为在实战中还有一些经验教训,并没体现出来.由于马上要给同事没培训celery了.我也来不及写太多.等后面,我们再慢慢补 ...

  3. rabbitmq系列五 之主题交换机

    1.主题 在前面的例子中,我们对日志系统进行了改进.使用了direct交换机代替了fanout交换机,从只能盲目的广播消息改进为有可能选择性的接收日志. 尽管直接交换机能够改善我们的日志系统,但是它也 ...

  4. Python操作rabbitmq系列(二):多个接收端消费消息

    今天,我们要逐步开始讨论rabbitmq稍微高级点的耍法了.了解这一步,对我们设计高并发的系统非常有用.当然,还可以使用kafka.不过还是算了,有几个硬性条件不支持,还是用rabbitmq吧. 循环 ...

  5. Python操作rabbitmq系列(四):根据类型订阅消息

    在上一章中,所有的接收端获取的所有的消息.这一章,我们将讨论,一些消息,仍然发送给所有接收端.其中,某个接收端,只对其中某些消息感兴趣,它只想接收这一部分消息.如下图:C1,只对error感兴趣,C2 ...

  6. Python操作rabbitmq系列(三):多个接收端消费消息

    接着上一章.这一章,我们要将同一个消息发给多个客户端.这就是发布订阅模式.直接看代码: 发送端: import pikaimport sys connection = pika.BlockingCon ...

  7. Python操作redis系列之 列表(list) (五)(转)

    # -*- coding: utf-8 -*- import redis r =redis.Redis(host=") 1. Lpush 命令将一个或多个值插入到列表头部. 如果 key 不 ...

  8. Python操作redis系列之 列表(list) (五)

    # -*- coding: utf- -*- import redis r =redis.Redis(host=,password=") 1. Lpush 命令将一个或多个值插入到列表头部. ...

  9. Python菜鸟之路:Python基础-Python操作RabbitMQ

    RabbitMQ简介 rabbitmq中文翻译的话,主要还是mq字母上:Message Queue,即消息队列的意思.rabbitmq服务类似于mysql.apache服务,只是提供的功能不一样.ra ...

随机推荐

  1. webStorm ctrl+L 跳转到指定行line eclipes快捷键

    webStorm ctrl+L 跳转到指定行line eclipes快捷键

  2. 是时候了解Java Socket底层实现了

    在Java中,提供了一系列Socket API,可以轻松建立两个主机之间的连接.读取数据,那底层到底怎么实现,很少人去关心.这其实最终还是通过调用操作系统提供得Socket接口完成(TCP/IP是由操 ...

  3. 1.Lambda表达式

    1.Lambda表达式 语法糖 也叫作糖衣语法,增强了代码的可读性 避免了出错的机会 但是,这种语法对于语言的功能并没有增强 和Lambda一样的糖衣语法还有:(1)泛型 <>(2)自动装 ...

  4. IE浏览器下载文件中文文件名乱码问题解决

    处理过程 根据IE的F12中的log提示,是因为http头信息中的编码替换了html文件中的编码.我最初的思路是设置Tomcat默认编码,但是我发现我已经在Server.xml中设置过,想到这里我想到 ...

  5. NeurIPS 2019 Spotlight | Cascade RPN,结构的艺术带来极致的提升

    论文提出Cascade RPN算法来提升RPN模块的性能,该算法重点解决了RPN在迭代时anchor和feature不对齐的问题,论文创新点足,效果也很惊艳,相对于原始的RPN提升13.4%AR 论文 ...

  6. django之forms组件,cookie&session

    forms组件 先自己实现注册功能,并且对用户输入的信息加限制条件如果用户输入的信息不符合条件,前端展示报错信息 from django.shortcuts import render,HttpRes ...

  7. Aleax prize (开放域聊天系统比赛)2018冠军论文阅读笔记

    Abstract Gunrock是一种社交机器人,旨在让用户参与开放域的对话.我们使用大规模的用户交互数据来迭代地改进了我们的机器人,使其更具能力和人性化.在2018年Alexa奖的半决赛期间,我们的 ...

  8. 「面试指南」解读JavaScript原始数据类型

    JavaScript 有 7 种原始数据类型: String(字符型) Number(数值型) Boolean(布尔值型) Undefined Null Object(对象型) Symbol(符号型, ...

  9. Django HttpResponse笔记

    HttpResponse 概述:给浏览器返回数据 HttpRequest对象是由django创建的,HttpResponse对象由程序员创建 用法 1:不调用模板,直接返回数据. 例: def get ...

  10. Linux常用的命令收藏

    摘要 Linux现在已经是大部分草根站长不可缺少的一部分,想要维护好你的网站就必须懂得常用的linux命令,这个可以加快你对服务器的维护,运营:同时Linux在嵌入式系统开发中有不可替代的优势,越来越 ...