Rabbitmq -- direct
阿新 • • 發佈:2018-01-05
圖片 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