rabbitmq學習5 主題交換機

2021-08-21 09:26:17 字數 2133 閱讀 7756

<?php

require_once __dir__ . '/vendor/autoload.php';

use phpamqplib\connection\amqpstreamconnection;

use phpamqplib\message\amqpmessage;

$connection = new amqpstreamconnection('localhost', 5672, 'guest', 'guest');

$channel = $connection->channel();

$channel->exchange_declare('topic_logs', 'topic', false, false, false);

$routing_key = isset($argv[1]) && !empty($argv[1]) ? $argv[1] : 'anonymous.info';

$data = implode(' ', array_slice($argv, 2));

if(empty($data)) $data = "hello world!";

$msg = new amqpmessage($data);

$channel->basic_publish($msg, 'topic_logs', $routing_key);

echo " [x] sent ",$routing_key,':',$data," \n";

$channel->close();

$connection->close();

<?php

require_once __dir__ . '/vendor/autoload.php';

use phpamqplib\connection\amqpstreamconnection;

$connection = new amqpstreamconnection('localhost', 5672, 'guest', 'guest');

$channel = $connection->channel();

$channel->exchange_declare('topic_logs', 'topic', false, false, false);

list($queue_name, ,) = $channel->queue_declare("", false, false, true, false);

$binding_keys = array_slice($argv, 1);

if( empty($binding_keys ))

foreach($binding_keys as $binding_key)

echo ' [*] waiting for logs. to exit press ctrl+c', "\n";

$callback = function($msg);

$channel->basic_consume($queue_name, '', false, true, false, false, $callback);

while(count($channel->callbacks))

$channel->close();

$connection->close();

執行:

執行下邊命令 接收所有日誌:

$ php receive_logs_topic.php "#"

執行下邊命令 接收來自」kern「裝置的日誌:

$ php receive_logs_topic.php "kern.*"

執行下邊命令 只接收嚴重程度為」critical「的日誌:

$ php receive_logs_topic.php "*.critical"

執行下邊命令 建立多個繫結:

$ php receive_logs_topic.php "kern.*" "*.critical"

執行下邊命令 傳送路由鍵為 "kern.critical" 的日誌:

$ php emit_log_topic.php "kern.critical" "a critical kernel error"

RabbitMQ學習(5) 主題

我們改進了我們的日誌系統 我們沒有使用只有虛擬廣播 的fanout 交換機,而是使用direct 交換機,並有選擇性地接收日誌的可能性。儘管使用 直接交換改進了我們的系統,但它仍然有侷限性 它不能根據多個標準進行路由選擇。在我們的日誌系統中,我們可能不僅要根據嚴重性來訂閱日誌,還要根據發出日誌的 進...

rabbitmq 理論 主題交換機

儘管直連交換機能夠改善我們的系統,但是它也有它的限制 沒辦法基於多個標準執行路由操作。在我們的日誌系統中,我們不只希望訂閱基於嚴重程度的日誌,同時還希望訂閱基於傳送 的日誌。unix工具syslog就是同時基於嚴重程度 severity info warn crit.和 裝置 facility au...

rabbitmq路由模式 訂閱 主題

1.依賴 junit junit 4.12 test com.rabbitmq amqp client 3.5.1 2.訊息提供者 public class test 4 direct provider 3.訊息接收者 public class test 4 direct consumer1 6,連...