在上一章大家可以认识到交换机的类型,本节将对direct
类型展开案例说明。
direct 交换机获取到绑定队列,判断路由键是否完全匹配,如果相匹配则发送消息到指定队列。
为了让消息通过同一个交换机到达不同的队列,我们需要在交换机处需要判断。
rabbitMQ已然帮我们实现了,它允许我们在交换机与队列之间的连线(这条大路),你可以给它起个名字,只有发送者说出这个名字,消息才会送到对应名字对面的队列中。
emmmmmmm那么,专业点吧~~我们将这个名字成为路由键
。
在rabbitMQ中,交换机通过设置交换机类型为
direct
,即可实现路由键的完全匹配。
1. 交换机类型设置
$channel->exchange_declare('mq_sms_send_ex3', AMQPExchangeType::DIRECT, false, false, false);
2. 路由键设置
$routing_key = $argv[1] ?? 'info';
$channel->basic_publish($msg, 'mq_sms_send_ex3', $routing_key);
<?php
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Exchange\AMQPExchangeType;
use PhpAmqpLib\Message\AMQPMessage;
//这里作者使用php7版本
$routing_key = $argv[1] ?? 'info';
//获取终端提示用户输入的数据
fwrite(STDOUT, "Please enter a message:\n");
$msg_str = fgets(STDIN);
//建立生产者与mq之间的连接
//参数:地址,端口,账号,密码
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
//在已连接基础上建立生产者与mq之间的通道
$channel = $connection->channel();
//声明初始化交换机
//参数:交换机名,路由类型,是否检测同名队列,是否开启队列持久化,通道关闭后是否删除队列
$channel->exchange_declare('mq_sms_send_ex4', AMQPExchangeType::DIRECT, false, false, false);
//生成消息
$msg = new AMQPMessage($msg_str);
//推送消息到某个交换机
//参数:消息,交换机名,路由键名 路由键动态设置
$channel->basic_publish($msg, 'mq_sms_send_ex4', $routing_key);
echo " [x] Sent: $msg_str \n";
$channel->close();
$connection->close();
1. 交换机类型设置
$channel->exchange_declare('mq_sms_send_ex4', AMQPExchangeType::DIRECT, false, false, false);
2. 路由键设置
$routing_keys = $argv[1] ? array_slice($argv, 1) : ['info', 'warn', 'error'];
foreach($routing_keys as $key){
$channel->queue_bind($queue_name, 'mq_sms_send_ex4', $key);
}
<?php
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Exchange\AMQPExchangeType;
//这里作者使用php7版本
$routing_keys = $argv[1] ? array_slice($argv, 1) : ['info', 'warn', 'error'];
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$channel = $connection->channel();
//声明初始化交换机
//参数:交换机名,路由类型,是否检测同名队列,是否开启队列持久化,通道关闭后是否删除队列
$channel->exchange_declare('mq_sms_send_ex4', AMQPExchangeType::DIRECT, false, false, false);
//声明初始化一条队列
//参数:队列名,是否检测同名队列,是否开启队列持久化,是否能被其他队列访问,通道关闭后是否删除队列
list($queue_name, ,) = $channel->queue_declare("", false, false, true, false);
//将队列与某个交换机进行绑定,并使用路由关键字
foreach($routing_keys as $key){
//参数:队列名,交换机名,路由键名
$channel->queue_bind($queue_name, 'mq_sms_send_ex4', $key);
}
echo ' [*] Waiting for messages', "\n";
$callback = function($msg) {
echo " [x] Received ", $msg->body, "\n";
//判断获取到quit后
if (trim($msg->body) == 'quit') {
$msg->getChannel()->basic_cancel($msg->getConsumerTag());
}
};
$channel->basic_qos(null, 1, null);
//
//参数:队列名,消费者标识符,不接收此使用者发布的消息,使用者是否使用自动确认模式,请求独占使用者访问,不等待,消息回调函数
$channel->basic_consume($queue_name, 'consumer1', false, true, false, false, $callback);
function shutdown($channel, $connection)
{
$channel->close();
$connection->close();
}
register_shutdown_function('shutdown', $channel, $connection);
while(count($channel->callbacks)) {
$channel->wait();
}