Rabbitmq - fanout模式(订阅模式|广播模式)

消息会推送给所有已绑定该交换器的队列
生产者
<?php
$v_host = 'order';
$exc_name = 'fanout-exc';//交换器名
//地址 端口 用户名 密码 vhost
$connection = new AMQPStreamConnection('localhost',5672,'rabbitmq','rabbitmq',$v_host);
//新建通道
$channel = $connection->channel();
//声明交换器 参数:交换器名、模式、不存在则自动创建、持久化、不自动消亡
$channel->exchange_declare($exc_name,'fanout',false,true,false);
//消息 参数:消息 、持久化
$data = 'this is fanout message';
$msg = new AMQPMessage($data,[
'delivery_mode'=>AMQPMessage::DELIVERY_MODE_PERSISTENT
]);
//将消息推送到交换器里
$channel->basic_publish($msg,$exc_name,$queue_name);
//关闭通道
$channel->close();
?>
消费者
$v_host = 'order';
$exc_name = 'fanout-exc'; //交换器名
//地址 端口 用户名 密码 vhost
$connection = new AMQPStreamConnection('localhost', 5672, 'rabbitmq', 'rabbitmq', $v_host);
//新建通道
$channel = $connection->channel();
//声明交换器 参数:交换器名、模式、不存在则自动创建、持久化、不自动消亡
$channel->exchange_declare($exc_name, 'fanout', false, true, false);
// ** 随机生成队列名(生成后返回的是数组,只有第一个元素是队列名) 临时生成的,退出程序则消失
list($queue_name,,) = $channel->queue_declare('', false, false, true, false);
$channel->queue_bind($queue_name, $exc_name);
$callback = function ($msg) {
echo 'received' . $msg->body . '\n';
$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号