消息队列控制灯代码_代码实现RabbitMQ死信队列的创建

‍前言:‍

    之前有写过死信队列的使用场景以及通过管控台创建死信。这次就通过代码实现死信队列的创建,同时也分享一下RabbitMQ封装的类。

准备:

1. 先准备一个死信队列(最后用来消费)的参数配置,包括虚拟机,交换机,队列,有效时间等,如下。

57c4d4ef897f5baf3deac89854bca26d.png

2. 按照上面在RabbitMQ中创建虚拟机和交换机,死信队列。并让交换机与死信队列绑定,操作方法前面有介绍。

54b280170fb1c3dd396ff4f24bc91d9f.png

3. 这里就直接提供rabbitMQ操作的基本封装的类,包括一个基类,生产者类,消费者类。

3.1. 基类。

<?php namespace rabbitmq;class BaseMQ{public $AMQPChannel ;public $AMQPConnection ;public $AMQPEnvelope ;public $AMQPExchange ;public $AMQPQueue ;public $conf ;public $exchange ;public $queue;public $route;public $queueArgs;public function __construct($host,$options,$args = []){
$config = include 'config/config.php';if (!$config)throw new \AMQPConnectionException('config error!');$this->host = array_merge($config,$host);isset($options['vhost']) && $this->host['vhost'] = $options['vhost'];$this->exchange = $options['exchange'];$this->queue = $options['queue'];$this->route = $options['route'];$this->queueArgs = $args;$this->AMQPConnection = new \AMQPConnection($this->host);if (!$this->AMQPConnection->connect())throw new \AMQPConnectionException("Cannot connect to the broker!\n");
}public function close(){$this->AMQPConnection->disconnect();
}public function channel(){if (!$this->AMQPChannel) {$this->AMQPChannel = new \AMQPChannel($this->AMQPConnection);
}return $this->AMQPChannel;
}public function exchange(){if (!$this->AMQPExchange) {$this->AMQPExchange = new \AMQPExchange($this->channel());$this->AMQPExchange->setName($this->exchange);
}return $this->AMQPExchange ;
}public function queue(){if (!$this->AMQPQueue) {$this->AMQPQueue = new \AMQPQueue($this->channel());
}return $this->AMQPQueue ;
}public function envelope(){if (!$this->AMQPEnvelope) {$this->AMQPEnvelope = new \AMQPEnvelope();
}return $this->AMQPEnvelope;
}
}

3.2. 生产者类。

<?php namespace rabbitmq;class ProductMQ extends BaseMQ{/** 只控制发送成功 不接受消费者是否收到
* @throws \AMQPChannelException
* @throws \AMQPConnectionException
* @throws \AMQPExchangeException
*/public function publish($message){
$message = is_array($message)?json_encode($message):$message;//频道
$channel = $this->channel();//创建交换机对象
$ex = $this->exchange();return $ex->publish($message, $this->route, AMQP_NOPARAM, array('delivery_mode' => 2));
}
}

3.3. 消费者。

<?php namespace rabbitmq;class ConsumerMQ extends BaseMQ{public function run($processMessage){// 创建交换机
$ex = $this->exchange();// direct类型
$ex->setType(AMQP_EX_TYPE_DIRECT); // 持久化
$ex->setFlags(AMQP_DURABLE);// 不存在就发布
$ex->declareExchange();// 创建队列
$q = $this->queue();// 设置队列名称
$q->setName($this->queue);// 持久化
$q->setFlags(AMQP_DURABLE); // 队列参数
is_array($this->queueArgs) && $q->setArguments($this->queueArgs);
$q->declareQueue();//绑定交换机与队列,并指定路由键// echo 'Queue Bind: '.$q->bind($this->exchange, $this->route)."\n";
$q->bind($this->exchange, $this->route);//阻塞模式接收消息// echo "Message:\n";if (!is_null($processMessage)) {while (True) {
$q->consume($processMessage);
}
}$this->close();
}
}
编码:

     上面的死信队列已经创建好了,接下来主要就是通过代码创建一个用于直接生产消息的普通队列,但是这个队列需要设置三个参数。

x-dead-letter-exchange:关联死信的交换机
x-dead-letter-routing-key     关联死信的路由key
x-message-ttl                 当前队列消息的有效期,也就是多久后消息自动进行死信队列,并且从本队列删除

   1. 代码部分:

public function addToDlx()
{
$host = [
'host' => '127.0.0.1',
'port' => '5672',
'login' => 'guest',
'password' => 'guest',
'vhost' => 'report',
'heartbeat' => 60
];

// 普通队列
$normal = [
'vhost' => 'report', // 虚拟机
'exchange' => 'normal', // 交换机
'route' => 'normal_route', // 路由key - 用于交换机与队列进行绑定
'queue' => 'normal_queue', // 队列
'expire' => 1000*60, // 有效时间单位:毫秒 - 1分钟
];

// 死信队列
$normal_dlx = [
'vhost' => 'report',
'exchange' => 'normal_dlx',
'route' => 'normal_dlx_route',
'queue' => 'normal_dlx_queue'
];

// 给普通队列关联死信队列,携带的参数
$dlx_args = [
'x-dead-letter-exchange' => $normal_dlx['exchange'],
'x-dead-letter-routing-key' => $normal_dlx['route'],
'x-message-ttl' => $normal['expire'],
];

通过消费者方式创建死信队列/
$dlx_mq = new ConsumerMQ($host,$normal,$dlx_args);
$dlx_mq->run(null);

//// 将消息放入普通队列/
$mq = new ProductMQ($host, $normal);

$param = json_encode([
'name' => 'test',
'id' => 11568,
'remark' => '测试一下'
]);

$mq->publish($param);

$mq->close();
}

2. 测试结果:

       通过postman点击上面接口,控制台就可以看出多出了一个normal队列,并且队列的 Features 为“ D TTL DLX DLK ”,$param的消息也会首先进入“normal”队列。

af8306677a8810576de22356244659ac.png

fc2caf3ecacbfd1b9a746373aff0ef92.png

2. 一分钟后(自己设置的),normal的消息会失效,进而开始添加到了死信队列“normal_dxl”,可以点击死信查看最新的消息信息。

2a5f1e1632dd12b31cb0f0a6b88949d3.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/427553.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

平板电脑可以插u盘吗_电视TV盒子安装app的六个方法,u盘/电脑/手机都可以安装...

点击上方蓝字 关注我们首先&#xff0c;要看盒子是否支持安装第三方app&#xff0c;这期只讲支持第三方app安装的安卓系统盒子&#xff0c;iOS盒子不讲。怎么看电视盒子能不能安装第三方&#xff1f;很简单&#xff0c;方法很多&#xff0c;最常见就是用装有apk文件的u盘连接盒…

drive es 软件兼容_某知名软件被完美修改!对不住了!

⭐星标Or 置顶⭐右上角三点-设为星标(置顶)今天给大家介绍两款超好用的免费神器&#xff01;支持&#xff0c;请点亮文章底部“在看” ?搜图神器绿化版安卓 / 9M这是一款装机必备的搜图应用&#xff0c;支持图片搜索&#xff0c;百度识图&#xff0c;谷歌识图&#xff0c;拍照…

5g pdu session_运营商下架4G套餐,用户被5G!

近日&#xff0c;网上突然出现诸多报道&#xff0c;称三大运营商为了推广5G套餐&#xff0c;开始下架4G套餐&#xff0c;用户办理套餐时只能选择价格相对较高的5G套餐。看到这些报道很多网友坐不住了&#xff0c;这难道要倒逼用户改用5G吗&#xff1f;要知道&#xff0c;三大运…

OpenCV图像处理形态学操作腐蚀Erode与膨胀Dilate

通俗的说&#xff1a;膨胀算法使图像扩大一圈。腐蚀算法使二值图像减小一圈。腐蚀&#xff1a;删除对象边界的某些像素膨胀&#xff1a;给图像中的对象边界添加像素算法&#xff1a;从图像处理角度看&#xff0c;二值图像的腐蚀和膨胀就是将一个小型二值图&#xff08;结构元素…

台达asda-b2伺服驱动器说明书_台达解决方案提升粉末冶金液压机的控制精度

项目背景粉末冶金液压机是一种利用液体压力来传递能量&#xff0c;实现各种压力加工工艺的机床&#xff0c;适用于各种金属及非金属粉末的压制成形&#xff0c;如铁基、铜基、钨、钛、锰、硼等。某生产企业所应用的粉末冶金液压机采用以台达油电伺服驱动器VFD-VJ系列为核心的控…

常州win8如何禁用应用商店_Win8系统当中Windows defnedder安全软件应该如何禁用?...

Win8系统如何禁用defender&#xff1f;Windows defender安全软件但是win8系统自带的&#xff0c;但有时该软件也会与其他软件发生冲突&#xff0c;那么这个时候应该如何禁用Windows defender安全软件呢&#xff1f;接下来就为大家分享win8系统禁用defender的操作方法。操作方法…

Django 的工程创建

1.环境安装 1. 创建虚拟环境 mkvirtualenv django_py3_1.11 -p python3注意需要联网 2. 安装Django 使用django 1.11.11版本&#xff0c;注意需要联网 pip install django1.11.113. 复习虚拟环境和pip的命令 # 虚拟环境 mkvirtualenv # 创建虚拟环境 rmvirtualenv # 删除虚拟…

python提取网页中p标签中的内容_使用Python进行爬虫的初学者指南

前言爬虫是一种从网站上抓取大量数据的自动化方法。即使是复制和粘贴你喜欢的网站上的引用或行&#xff0c;也是一种web抓取的形式。大多数网站不允许你保存他们网站上的数据供你使用。因此&#xff0c;唯一的选择是手动复制数据&#xff0c;这将消耗大量时间&#xff0c;甚至可…

OpenCv的连通域操作

由于项目需要&#xff0c;要对图像中的最大连通域进行标定&#xff0c;并且存储。首先需要使用cvFindCountour对边缘进行标定&#xff0c;其实它的原理就是连通域的边缘提取&#xff1b;其次就是对连通域进行大小判断找出最大的连通域&#xff1b;最后当然就是进行Rect并且ROI了…

DAY5网络

1.用select实现TCP客户端程序 #include <head.h> #define PORT 9999 // 服务器端口号 #define IP "192.168.125.74" // 服务器IP地址#define CIP "192.168.125.74" // 客户端 #define CPORT 6666int main(int argc, const char* argv[]) {// 创建套…

pyCharm最新2018激活码

最近开始研究python&#xff0c;因公司需要获取一些数据&#xff0c;比如电影名&#xff0c;航班名&#xff0c;航班号&#xff0c;列车号等等。所以让我来做一个爬虫去获取数据。所以我们就从这篇博文开始吧&#xff01;&#xff01;&#xff01; 首先告诉大家激活方式&#x…

提高电脑反应速度_设计师笔记本电脑推荐——视觉系ThinkBook 15p创造本

说到设计师笔记本电脑推荐&#xff0c;非近期大热的高颜值、高性能、更出彩的ThinkBook 15p创造本莫属了。作为专为时尚青年量身定做的品牌系列&#xff0c;ThinkBook一直都以“锐意破局”、“以思考重构世界”的理念征服着广大优秀的年轻创意用户&#xff0c;此次推出的全新产…

C语言 system函数

Windows函数windows操作系统下system () 函数详解&#xff08;主要是在C语言中的应用&#xff09; 函数名&#xff1a; system功 能&#xff1a; 发出一个DOS命令用 法&#xff1a; int system(char *command);system函数已经被收录在标准c库中&#xff0c;可以直接调用程序例…

javascript option 菜单图标_MacBook上神奇的Option键

不知道昨天的(Mac上Command键的妙用)有没有帮助到大家呢&#xff1f;今天我们就来讲一讲Mac上的Option键。Option作为Mac上四大控制键(Shift&#xff0c;Command&#xff0c;Control&#xff0c;Option)之一&#xff0c;Option在单独使用的情况下&#xff0c;很多时候是发挥调出…

OpenCV中cvResize函数图象放缩

图像大小变换void cvResize( const CvArr* src, CvArr* dst, int interpolationCV_INTER_LINEAR );src&#xff1a;输入图像. dst&#xff1a;输出图像. interpolation&#xff1a;差值方法: • CV_INTER_NN - 最近邻差值, • CV_INTER_LINEAR - 双线性差值 (缺省使用) • CV_…

学生电脑哪个牌子好_家用医用酒精棉球哪个牌子好,酒精棉片哪个牌子好

酒精制品是现在生活中常用的消毒剂&#xff0c;包括酒精消毒液、酒精洗手液、酒精喷雾剂、酒精湿巾、酒精棉球和酒精棉片等。这些酒精制品各有各的作用&#xff0c;市面上的品牌也比较多。下面就来介绍家用医用酒精棉球哪个牌子好。1、家用医用酒精棉球哪个牌子好目前在市面上使…

OpenCV图像的轮廓的匹配

一个跟轮廓相关的最常用到的功能是匹配两个轮廓.如果有两个轮廓,如何比较它们;或者如何比较一个轮廓和另一个抽象模板.矩比较两个轮廓最简洁的方式是比较他们的轮廓矩.这里先简短介绍一个矩的含义.简单的说,矩是通过对轮廓上所有点进行积分运算(或者认为是求和运算)而得到的一个…

Java Servlet 过滤器与 springmvc 拦截器的区别?

前言&#xff1a;在工作中&#xff0c;遇到需要记录日志的情况&#xff0c;不知道该选择过滤器还是拦截器&#xff0c;故总结了一下。 servlet 过滤器 定义 java过滤器能够对目标资源的请求和响应进行截取。过滤器的工作方式分为四种 应用场景 可以通过 doFilter 方法的 reques…

surface pro 6 黑苹果_微软Surface新款超薄触控笔抢鲜评测

微软Surface新款超薄触控笔抢鲜评测中文名&#xff1a;微软 Surface 超薄触控笔英文名&#xff1a;Surface Slim Pen日文名&#xff1a;Surface スリム ペン颜色&#xff1a;典雅黑&#xff08;只有这一个颜色&#xff09;中文官方链接&#xff1a;https://www.microsoftstore.…

java轻松实现无锁队列

1、什么是无锁(Lock-Free)编程 当谈及 Lock-Free 编程时&#xff0c;我们常将其概念与 Mutex(互斥) 或 Lock(锁) 联系在一起&#xff0c;描述要在编程中尽量少使用这些锁结构&#xff0c;降低线程间互相阻塞的机会&#xff0c;以提高应用程序的性能。类同的概念还有 "Lock…