RabbitMQ消息队列-一对一模式

2018-12-10 21:00:00
赵勤松
原创
2529
摘要:所谓一对一模式,就是一个消息队列只有一个生产者和一个消费者,生产者发送消息,消费者处理消息,本文将以PHP代码的进行剖析

一对一模式,以图片形式,可表示为

生产者生成消息,置入消息队列的最前端,而消息者则从消息队列的最末尾读取消息,这就是简单模式下的消息队列处理方式。


下面以ThinkPHP下的代码来展示一下处理过程。


创建一个控制器类MQSimple,其对应的类文件MQSimple.php中的代码如下


<?php
/**
 * Created by PhpStorm.
 * User: zhaoqinsong
 * Date: 2018/12/10
 * Time: 3:44 PM
 */
namespace app\msq\controller;
class MQSimple
{
    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->queue_declare("simple", false, true, false, false);    //  生成一个持久化消息队列
    }
    public function index()
    {
        echo "rabbitmq of test";
    }
    public function mq_send() {
        //  向消息队列simple发送消息
        $msg = new AMQPMessage("Hello World");
        $this->msq_channel->basic_publish($msg, "", "simple");
    }
    public function mq_recv() {
        //  处理消息队列simple中的消息
        $callback = function($msg) {
            $msg = $msg->body;
            echo "recv:$msg\n";
        };
        $this->msq_channel->basic_consume("simple", "", 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();
    }
    
}



指定路由,设定/simple/send指向此类的mq_send方法,将/simple/recv指向此类的mq_recv方法。


在命令行下,先启动接收消息队列的程序(切换到ThinkPHP框架的根目录下)


# php public/index.php /simple/recv
后面再开启一个连接,启动发送消息的程序(同样需要切换到ThinkPHP框架的根目录下)


# php public/index.php /simple/send
这时,查看接收消息队列的程序,可看到


# php public/index.php /simple/recv
recv:Hello World
也就是发送的消息被正确接收了,再看消息列表的状态


# rabbitmqctl list_queues
Timeout: 60.0 seconds ...
Listing queues for vhost / ...
simple  0
simple消息队列中的消息已经被处理完毕。


文章分类
联系我们
联系人: powereye
Email: zqs@someapp.cn
QQ: 1134846
微信: powereye