1. 程式人生 > >Rabbitmq -- direct

Rabbitmq -- direct

圖片 oca ever local ctrl+c 分割 localhost 全部 pro

一、前言

  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