RabbitMQ-消息队列之topic使用

1、安装rabbitmq

怎么安装rabbitmq请查看之前课程,如果已经安装,请略过此步。

2、创建vendor文件夹或是直接采用PHP框架

mkdir vendor

3、进入文件

cd vendor

4、安装php扩展

composer require php-amqplib/php-amqplib

5、进入上级创建topic文件夹

cd ../
mkdir topic

6、进入topic文件并创建生产者php

cd topic
touch publish.php

7、输入topic生产者内容

<?php

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


use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;

$v_host = 'order';

$exc_name ='topic_log';

$routing_key = 'goods.warn';

$connection = new AMQPStreamConnection('localhost',5672,'wangyulong','wangyulong',$v_host);

$channel = $connection->channel();


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

$data = 'this is '.$routing_key.' message';

$msg = new AMQPMessage($data,['delivery_mode'=>AMQPMEssage::DELIVERY_MODE_PERSISTENT]);


$channel->basic_publish($msg,$exc_name,$routing_key);

$channel->close();

$connection->close();

8、创建消费者php

touch all.php
touch user.php
touch warn.php

9、输入topic消费者内容

vi all.php
<?php

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

use PhpAmqpLib\Connection\AMQPStreamConnection;

$v_host ='order';

$exc_name = 'topic_log';

$routing_key = '#';

$connection = new AMQPStreamConnection('localhost',5672,'wangyulong','wangyulong',$v_host);

$channel = $connection->channel();

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


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

$channel->queue_bind($queue_name,$exc_name,$routing_key);

$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();

$connection->close();
vi user.php
<?php

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

use PhpAmqpLib\Connection\AMQPStreamConnection;

$v_host ='order';

$exc_name = 'topic_log';

$routing_key = 'user.*';

$connection = new AMQPStreamConnection('localhost',5672,'wangyulong','wangyulong',$v_host);

$channel = $connection->channel();

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


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

$channel->queue_bind($queue_name,$exc_name,$routing_key);

$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();

$connection->close();
vi warn.php
<?php

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

use PhpAmqpLib\Connection\AMQPStreamConnection;

$v_host ='order';

$exc_name = 'topic_log';

$routing_key = '*.warn';

$connection = new AMQPStreamConnection('localhost',5672,'wangyulong','wangyulong',$v_host);

$channel = $connection->channel();

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


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

$channel->queue_bind($queue_name,$exc_name,$routing_key);

$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();

$connection->close();

10、执行消费者

php all.php
php user.php
php warn.php

11、执行生产者

php publish.php

此时你会发现只有warn.php对应的消费者及all.php都有数据,如果你把publish.php生产者里面的$routing_key对应的值改成user.goods,你会发现user.php及all.php对应的消费者都有数据。这就是rabbitmq topic工作模式硬实力

  • 9
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值