php+rabbitMQ操作之延迟队列(延迟插件)
composer依赖包是官方的php-amqplib/php-amqplib(需打开php的sockets扩展,否则会报错)
第一步 【安装延迟队列插件】:
rabbitMQ默认是没有延迟队列插件的,我们需要手动进行安装。
wget https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/releases/download/3.9.0/rabbitmq_delayed_message_exchange-3.9.0.ez
cp rabbitmq_delayed_message_exchange-3.9.0.ez /opt/rabbitmq/plugins/
rabbitmq-plugins enable rabbitmq_delayed_message_exchange
第二步 【创建延迟队列生产者】:
<?phprequire_once "../vendor/autoload.php";use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;class SendMessage {protected $rabbitmq_channel;protected $rabbitmq_connection;public function __construct() {$this->rabbitmq_connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');$this->rabbitmq_channel = $this->rabbitmq_connection->channel();}/*** 生产延迟队列* @param $msg*/public function sendMessage($msg) {//声明死信交换机$this->rabbitmq_channel->exchange_declare('delayed_exchange','x-delayed-message',false,true,false,false,false,new \PhpAmqpLib\Wire\AMQPTable(['x-delayed-type' => \PhpAmqpLib\Exchange\AMQPExchangeType::FANOUT]));$headers = new \PhpAmqpLib\Wire\AMQPTable(['x-delay' => 7000]);$message = new AMQPMessage($msg, ['delivery_mode' => 2]);$message->set('application_headers', $headers);$this->rabbitmq_channel->basic_publish($message, 'delayed_exchange');$datetime = date('Y/m/d H:i:s');echo "成功发送延迟消息 : {$msg} , {$datetime} \n";}/*** @throws Exception*/public function __destruct(){$this->rabbitmq_channel->close();$this->rabbitmq_connection->close();}
}try {$sendMessage = new SendMessage();$sendMessage->sendMessage("这是一条延迟消息");} catch (\Throwable $e) {echo $e->getMessage();}
第三步 【创建延迟队列消费者】:
<?phprequire_once "../vendor/autoload.php";use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;class ReceiveMessage {protected $rabbitmq_channel;protected $rabbitmq_connection;public function __construct() {$this->rabbitmq_connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');$this->rabbitmq_channel = $this->rabbitmq_connection->channel();}/*** 消费延迟队列* @throws ErrorException*/public function receiveMessage() {//声明死信交换机$this->rabbitmq_channel->exchange_declare('delayed_exchange','x-delayed-message',false,true,false,false,false,new \PhpAmqpLib\Wire\AMQPTable(['x-delayed-type' => \PhpAmqpLib\Exchange\AMQPExchangeType::FANOUT]));//声明死信队列$this->rabbitmq_channel->queue_declare('delayed_queue',false,true,false,false,false,new \PhpAmqpLib\Wire\AMQPTable(['x-dead-letter-exchange' => 'delayed']));//绑定队列到交换机$this->rabbitmq_channel->queue_bind('delayed_queue', 'delayed_exchange');echo "正在等待延迟队列消息, waiting... \n";$callback = function (AMQPMessage $message) {//$headers = $message->get('application_headers');//$nativeData = $headers->getNativeData();echo $message->body . '-------' . date('Y/m/d H:i:s') . "\n";$message->ack();};$this->rabbitmq_channel->basic_consume('delayed_queue','',false,false,false,false,$callback);while ($this->rabbitmq_channel->is_consuming()) {$this->rabbitmq_channel->wait();}}
}try {$receiveMessage = new ReceiveMessage();$receiveMessage->receiveMessage();} catch (\Throwable $e) {echo $e->getMessage();}
第四步【测试】:
首先执行消费者进行监听队列
现在执行生产者来发送一条延迟消息
再次回到消费者控制台查看消费情况
由此可见,我们上面生产的延迟消息['x-delay' => 7000](7秒),消费时间则正是7秒后.
php+rabbitMQ操作之延迟队列(延迟插件)相关推荐
- docker rabbitmq 安装 延迟队列 rabbitmq_delayed_message_exchange 插件
以 官方的 rabbitmq:3.9.20-management 为例,默认开启的插件有4个,如下所示 2022-07-09 21:31:55.624125+08:00 [info] <0.8 ...
- [MQ] 延迟队列/延迟插件下载
✨✨个人主页:沫洺的主页
- Rabbitmq超级详细的笔记,包括安装,基本命令,rabbitmq的七种消息模式,以及死信队列,延迟队列,优先级队列和惰性队列的介绍
RabbitMQ 文章目录 RabbitMQ 1 RabbitMQ介绍 1.1 基本介绍 1.2 RabbitMQ的安装 1.2.1 ubuntu20.04 安装rabbitmq 1.2.2 cent ...
- RabbitMQ 延迟队列-对于入门来说可以快速上手
RabbitMQ 延迟队列-非常非常实用 RabbitMQ 延迟队列-非常非常实用 一.使用场景 二.消息延迟推送的实现 三.项目具体实现 RabbitMQ 延迟队列-非常非常实用 一.使用场景 ...
- RabbitMQ 延迟队列,太实用了!
点击关注公众号,Java干货及时送达 目前常见的应用软件都有消息的延迟推送的影子,应用也极为广泛,例如: 淘宝七天自动确认收货.在我们签收商品后,物流系统会在七天后延时发送一个消息给支付系统,通知支付 ...
- RabbitMQ(九):RabbitMQ 延迟队列,消息延迟推送(Spring boot 版)
应用场景 目前常见的应用软件都有消息的延迟推送的影子,应用也极为广泛,例如: 淘宝七天自动确认收货.在我们签收商品后,物流系统会在七天后延时发送一个消息给支付系统,通知支付系统将款打给商家,这个过程持 ...
- RabbitMQ,Springboot整合RabbitMQ实现 消息可靠性投递,Consumer ACK,TTL,死信队列,使用TTL+死信队列=延迟队列
搭建SpringBoot项目,用于演示 springboot版本 <!-- spring boot --><dependency><groupId>org.spri ...
- php rabbitmq延迟队列示例
原文:https://blog.csdn.net/qq_26656329/article/details/75502468 Python示例请移步 官方有关于延迟队列的插件,可以更灵活的设置延迟队列 ...
- SpringBoot整合RabbitMQ 消息可靠投递、手动ack、延迟队列、死信队列、消息幂等性保障、消息积压
1.消息可靠投递 在使用 RabbitMQ 的时候,作为消息发送方希望杜绝任何消息丢失或者投递失败场景.RabbitMQ 为我们提供了两种方式用来控制消息的投递可靠性模式. confirm 确认模式 ...
- rabbitmq 消息延迟推送--插件模式
到此 灵熙云工作室 - 实践出真理 查看全文内容 应用场景 目前常见的应用软件都有消息的延迟推送的影子,应用也极为广泛,例如: 淘宝七天自动确认收货.在签收商品后,物流系统会在七天后延时发送一个消息给 ...
最新文章
- RxJava firstElement 与 lastElement 以及 elementAt
- 设计一个矩形类rectangle_万字长文带你捋清六种设计模式的设计原则(建议收藏)...
- Visual Studio 2008 Samples Page
- 利用SMS OSD实现win2008操作系统的部署
- 精确分割和筛选音频从长的音频中
- 多任务学习有用的资料
- 删除指定路径下的文件
- 品茗论道说广播(Broadcast内部机制讲解)
- 导师 = advisor + supervisor
- BZOJ - 2744 朋友圈 (二分图上的最大团)
- 0x29——如何把自己iphone app传到iphone上
- 通用业务平台设计(一):概览
- QtCreator 编译时提示 warning C4819 的解决办法
- linux 学习 vi简介; vi下三种工作方式。
- (转)听赌徒谈风险:没犯任何错误照样输个精光
- Ubuntu 16.04 安装搜狗输入法
- c 语言中析构函数,详解C++编程中的析构函数
- android代码判断当前手机的手机号码是属于移动、联通、还是电信的
- 罗技的鼠标驱动试用感受
- NODEJS day_04(5.24)Express-2
热门文章
- catalina java opts,catalina.bat中适当的位置设置JAVA_OPTS
- Zookeeper的事务--Transaction
- Selenium简单的163邮箱登录实例
- xmpp怎么让群主踢人?
- python数学符号读法大全_数学符号及读法大全
- 华为交换机CPU处理报文原理
- TeamViewer三种许可证的区别是什么?
- 大数据:对大数据的理解
- python实现华氏温度和摄氏温度转换
- 明星造型师Tara Swennen和Glamhive创始人Stephanie Sprangers再次汇聚全球造型、时尚、美妆和女性赋权领域“大咖”参加突破性数字盛会