码迷,mamicode.com
首页 > 其他好文 > 详细

Rabbitmq -- direct

时间:2018-01-05 18:29:19      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:ons   前言   channel   change   def   class   tar   split   queue   

一、前言

  RabbitMQ还支持根据关键字发送,即:队列绑定关键字,发送者将数据根据关键字发送到消息exchange。direct类型的Exchange路由规则也很简单,它会把消息路由到那些binding key与routing key完全匹配的Queue中。

  技术分享图片

二、Exchange direct

  direct类型的Exchange路由规则是完全匹配binding key与routing key

  生产端:

# -*- coding: UTF-8 -*-

import pika

# 创建一个连接
connection = pika.BlockingConnection(pika.ConnectionParameters(
    host=‘localhost‘))

# 创建一个管道
channel = connection.channel()

# 声明exchange 及类型
channel.exchange_declare(exchange=‘direct_log‘,
                         exchange_type=‘direct‘)

# 输入信息,格式为 info from info test 类似
input_data = input(‘>>:‘).strip()

# 将输入的信息以空格为分割,转换为列表
data_list = input_data.split(‘ ‘)

# 三元运算,如果输入信息存在,就使用输入的信息data_list[0],否则用 ‘info‘
severity = data_list[0] if len(data_list) > 1 else ‘info‘

message = ‘ ‘.join(data_list[2:]) or ‘hello,world!‘

# 这里的routing_key就是 data_list[0] 或 ‘info‘
channel.basic_publish(exchange=‘direct_log‘,
                      routing_key=severity,
                      body=message)
print(‘[x] Sent %r:%r‘ % (severity, message))

connection.close()

  消费端:

# -*- coding: UTF-8 -*-

import pika

connection = pika.BlockingConnection(pika.ConnectionParameters(
    host=‘localhost‘))

channel = connection.channel()

# 声明exchange 及类型
channel.exchange_declare(exchange=‘direct_log‘,
                         exchange_type=‘direct‘)

channel.exchange_declare(exchange=‘direct_log‘,
                         exchange_type=‘direct‘)

result = channel.queue_declare(exclusive=True)

queue_name = result.method.queue

# 在此我们定义一些列表,列表内容如下
# 这3个列表分别用来测试和routing_key匹配情况
# 第一种只允许接收info的信息
# 第二种允许接收info 和 warning的信息
# 第三种允许接收 info、warning和error的信息

# severities = [‘info‘]
severities = [‘info‘, ‘warning‘]
# severities = [‘info‘, ‘warning‘, ‘error‘]

for severity in severities:
    channel.queue_bind(exchange=‘direct_log‘,
                       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()

  在目前的情况下,severities = [‘info‘, ‘warning‘],消费端能接收info 和warning的信息。 但是 error的信息不能收到

  生产端输入: info from info test /   warning from warning test

  技术分享图片

  同理如果只有 [‘info‘] 就只能收 info 的信息, 如果全部都包括,则 info、warning和 error的信息都能收到

 

  

Rabbitmq -- direct

标签:ons   前言   channel   change   def   class   tar   split   queue   

原文地址:https://www.cnblogs.com/bigberg/p/8206123.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!