Rabbitmq - direct模式(路由模式)

在这样的设置中,使用路由键orange发布到交换器的消息将被路由到队列Q1。带有black或green路由键的消息将发送到Q2。所有其他消息将被丢弃

使用相同的绑定键绑定多个队列是完全合法的。示例中,可以使用绑定键black在交换器X和队列Q1之间添加绑定。在这种情况下,直接交换的行为类似于扇出并将消息广播到所有匹配的队列。带有路由键black的消息将被传送到 队列Q1和队列Q2。
生产者
<?php
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;
$v_host = 'test';
$exc_name = 'direct-exc'; //交换器名
$routing_key = 'info';
//地址 端口 用户名 密码 vhost
$connection = new AMQPStreamConnection('localhost', 5672, 'rabbitmq', 'rabbitmq', $v_host);
//新建通道
$channel = $connection->channel();
//声明交换器 参数:交换器名、模式、不存在则自动创建、持久化、不自动消亡
$channel->exchange_declare($exc_name, 'direct', false, true, false);
//消息 参数:消息 、持久化
$data = 'this is direct message';
$msg = new AMQPMessage($data, [
'delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT
]);
//将消息推送到交换器里
$channel->basic_publish($msg, $exc_name, $routing_key);
//关闭通道
$channel->close();
$connection->close();
消费者
<?php
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;
$v_host = 'test';
$exc_name = 'direct-exc'; //交换器名
$routing_key = 'info';
//地址 端口 用户名 密码 vhost
$connection = new AMQPStreamConnection('localhost', 5672, 'rabbitmq', 'rabbitmq', $v_host);
//新建通道
$channel = $connection->channel();
//声明交换器 参数:交换器名、模式、不存在则自动创建、持久化、不自动消亡
$channel->exchange_declare($exc_name, 'direct', false, true, false);
//随机生成队列名(生成后返回的是数组,只有第一个元素是队列名) 临时生成的,退出程序则消失
list($queue_name,,) = $channel->queue_declare('', false, false, true, false);
$channel->queue_bind($queue_name, $exc_name, $routing_key);
$callback = function ($msg) {
var_dump('received :' . $msg->body);
$msg->ack();
};
//一次只消费一条消息,未确认消费前不可消费其他消息
$channel->basic_qos(null, 1, null);
$channel->basic_consume($queue_name, '', false, false, false, false, $callback);
while ($channel->is_open()) {
$channel->wait();
}
//关闭通道
$channel->close();

浙公网安备 33010602011771号