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();
posted @ 2022-08-22 16:03  Myifb  阅读(61)  评论(0)    收藏  举报