RabbitMQ消息队列-交换机Fanout模式
- 2018-12-11 20:30:00
- 赵勤松 原创
- 1363
在Fanout类型的路由控制下,交换机将每一个消息,会发给每一个绑定监听的消息队列中,下面我们以ThinkPHP的代码来详细说明这一过程。
创建一个控制器类MQExchangeFanout,其对应的类文件MQExchangeFanout.php中的代码如下
<?php
/**
* Created by PhpStorm.
* User: zhaoqinsong
* Date: 2018/12/11
* Time: 9:44 AM
*/
namespace app\msq\controller;
use think\App;
use think\Controller;
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;
class MQExchangeFanout extends Controller
{
var $msq_connect;
var $msq_channel;
public function __construct(App $app)
{
parent::__construct($app);
$this->msq_connect = new AMQPStreamConnection("localhost", 5672, "phpmsq", "123456");
$this->msq_channel = $this->msq_connect->channel();
$this->msq_channel->exchange_declare("exchange", "fanout");
}
public function index()
{
echo "rabbitmq of test";
}
public function mq_send()
{
$msg = new AMQPMessage("Hello World");
$this->msq_channel->basic_publish($msg, "exchange", ""); // 路由键即使设置也会无效
}
public function mq_recv1()
{
$this->msq_channel->queue_declare("simple1", false, true, false, false); // 生成一个持久化消息队列
$this->msq_channel->queue_bind("simple1", "exchange", ""); // 路由键即使设置也会无效
$this->msq_channel->basic_qos(null,1, null);
// 处理消息队列simple中的消息
$callback = function($msg) {
$body = $msg->body;
echo "recv:$body\n";
};
$this->msq_channel->basic_consume("simple1", "", false, true, false, false, $callback);
while ($this->msq_channel->callbacks) {
$this->msq_channel->wait();
}
}
public function mq_recv2()
{
$this->msq_channel->queue_declare("simple2", false, true, false, false); // 生成一个持久化消息队列
$this->msq_channel->queue_bind("simple2", "exchange", ""); // 路由键即使设置也会无效
$this->msq_channel->basic_qos(null,1, null);
// 处理消息队列simple中的消息
$callback = function($msg) {
$body = $msg->body;
echo "recv:$body\n";
};
$this->msq_channel->basic_consume("simple2", "", false, true, false, false, $callback);
while ($this->msq_channel->callbacks) {
$this->msq_channel->wait();
}
}
public function __destruct()
{
$this->msq_channel->close();
$this->msq_connect->close();
}
}
指定路由,设定/fanout/send指向此类的mq_send方法,/fanout/recv1指向mq_recv1方法,/fanout/recv2指向mq_recv2方法。
在命令行下,先创建两个服务器连接,用于执行接收消息的程序
# php public/index.php /fanout/recv1
# php public/index.php /fanout/recv2
然后再创建一个服务器连接,用于执行发送消息的程序
# php public/index.php /fanout/send
这时,可以在两个消息接收端,都看到该消息被接收了
# php public/index.php /fanout/recv1 recv:Hello World
# php public/index.php /fanout/recv2 recv:Hello World因此,发往交换机的消息,被同时发送到了绑定该交换机的两个消息队列之中。
在fanout模式中,路由键的参数即使设置,也会被忽略。
文章分类
联系我们
| 联系人: | powereye |
|---|---|
| Email: | zqs@someapp.cn |
| QQ: | 1134846 |
| 微信: | powereye |