【rabbitMQ】-延迟队列-模拟控制智能家居的操作指令

news2024/11/26 4:46:59

这个需求为控制智能家居工作,把控制智能家居的操作指令发到队列中,比如:扫地机、洗衣机到指定时间工作

一.什么是延迟队列?

延迟队列存储的对象是对应的延迟消息,所谓“延迟消息” 是指当消息被发送以后,并不想让消费者立刻拿到消息,而是等待特定时间后,消费者才能拿到这个消息进行消费。

二.如何设置延迟队列?

1.配置2个业务队列(扫地机执行命令业务队列,洗衣机执行命令业务队列),绑定到业务交换机上

2.为业务队列配置死信交换机和路由key

3.为死信交换机配置2个延迟队列(扫地机执行命令延迟队列,洗衣机执行命令延迟队列)

三.延迟队列代码落地

复制代码

using MengLin.Shopping.RabbitMQ.Common;
using RabbitMQ.Client;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MengLin.Shopping.RabbitMQ.MsgProducer.QueueType.Delay
{
    /// <summary>
    /// 延迟队列
    /// </summary>
    public class DelayQueue
    {
        public static void SendMessage()
        {
            //业务交换机
            var exchangeBusiness = "business-exchange";
            
            var queueBusinessSaoDiJiCommand = "SaoDiJiCommand-business-queue";//扫地机执行命令业务队列
            var routeKeyBusinessSaoDiJiCommand = "SaoDiJiCommand-business-routekey";//扫地机执行命令路由key

            var queueBusinessXiYiJiCommand = "XiYiJiCommand-business-queue";//洗衣机执行命令业务队列
            var routeKeyBusinessXiYiJiCommand = "XiYiJiCommand-business-routekey";//洗衣机执行命令路由key

            //死信交换机
            var exchangeDeadLetter = "deadLetter-exchange";

            //扫地机执行命令的延时队列和路由key
            var delaySaoDiJiCommandQueue = "SaoDiJiCommand-delay-queue";
            var routeKeyDelaySaoDiJi = "SaoDiJi-delay-routekey";

            //洗衣机执行命令的延时队列和路由key
            var delayXiYiJiCommandQueue = "XiYiJiCommand-delay-queue";
            var routeKeyDelayXiYiJi = "XiYiJi-delay-routekey";

            using (var connection = RabbitMQHelper.GetConnection())
            {
                using (var channel = connection.CreateModel())
                {
                    //创建死信交换机(死信交换机对交换机类型没有要求)
                    channel.ExchangeDeclare(exchange: exchangeDeadLetter, type: ExchangeType.Direct, durable: true, autoDelete: false);

                    //创建扫地机执行命令的延时队列
                    channel.QueueDeclare(queue: delaySaoDiJiCommandQueue, durable: true, exclusive: false, autoDelete: false);

                    //创建洗衣机执行命令的延时队列
                    channel.QueueDeclare(queue: delayXiYiJiCommandQueue, durable: true, exclusive: false, autoDelete: false);

                    //绑定死信交换机到扫地机执行命令的延时队列
                    channel.QueueBind(exchange: exchangeDeadLetter, queue: delaySaoDiJiCommandQueue, routingKey: routeKeyDelaySaoDiJi);

                    //绑定死信交换机到洗衣机执行命令的延时队列
                    channel.QueueBind(exchange: exchangeDeadLetter, queue: delayXiYiJiCommandQueue, routingKey: routeKeyDelayXiYiJi);

                    //创建业务交换机
                    channel.ExchangeDeclare(exchange: exchangeBusiness, type: ExchangeType.Direct, durable: true, autoDelete: false);

                    //创建扫地机命令业务队列
                    Dictionary<string, object> dic1 = new Dictionary<string, object>();
                    dic1.Add("x-expires", 30 * 6 * 10000); //30分钟后扫地机命令业务队列自动干掉
                    dic1.Add("x-message-ttl", 10 * 6 * 10000);//设置消息在扫地机命令业务队列中的存活时间,即过期时间(消息如果10分钟内没有消费,就会放入扫地机执行命令的延时队列里)
                    dic1.Add("x-dead-letter-exchange", exchangeDeadLetter);//过期消息转向路由  
                    dic1.Add("x-dead-letter-routing-key", routeKeyDelaySaoDiJi);//设置死信交换机的路由key,死信交换机会根据路由key去找到对应的延迟队列
                    channel.QueueDeclare(queue: queueBusinessSaoDiJiCommand, durable: true, exclusive: false, autoDelete: false, arguments:dic1);
                    //绑定业务交换机到扫地机命令业务队列
                    channel.QueueBind(queue: queueBusinessSaoDiJiCommand, exchange: exchangeBusiness, routingKey: routeKeyBusinessSaoDiJiCommand);


                    //创建洗衣机命令业务队列
                    Dictionary<string, object> dic2 = new Dictionary<string, object>();
                    dic2.Add("x-expires", 30 * 6 * 10000); //30分钟后洗衣机命令业务队列自动干掉
                    dic2.Add("x-message-ttl", 20 * 6 * 10000);//设置消息在洗衣机命令业务队列中的存活时间,即过期时间(消息如果20分钟内没有消费,就会放入洗衣机执行命令的延时队列里)
                    dic2.Add("x-dead-letter-exchange", exchangeDeadLetter);//过期消息转向路由  
                    dic2.Add("x-dead-letter-routing-key", routeKeyDelayXiYiJi);//过期消息转向路由相匹配routingkey  
                    channel.QueueDeclare(queue: queueBusinessXiYiJiCommand, durable: true, exclusive: false, autoDelete: false, arguments: dic2);
                    //绑定业务交换机到洗衣机命令业务队列
                    channel.QueueBind(queue: queueBusinessXiYiJiCommand, exchange: exchangeBusiness, routingKey: routeKeyBusinessXiYiJiCommand);

                    Console.WriteLine("请输入发送的内容:");
                    var message = Console.ReadLine();
                    var body = Encoding.UTF8.GetBytes(message);
                  

                    //消息持久化,既然都要用到死信队列了,说明这条消息还是比较重要的
                    var properties = channel.CreateBasicProperties();
                    properties.Persistent = true;

                    if(message.Contains("aa"))
                    {
                        //发布消息到扫地机命令业务队列
                        channel.BasicPublish(exchange: exchangeBusiness,
                                             routingKey: routeKeyBusinessSaoDiJiCommand,
                                             basicProperties: properties,
                                             body: body);
                    }
                    else
                    {
                        //发布消息洗衣机命令业务队列
                        channel.BasicPublish(exchange: exchangeBusiness,
                                             routingKey: routeKeyBusinessXiYiJiCommand,
                                             basicProperties: properties,
                                             body: body);
                    }

                } 
            }
        }
    }
}

复制代码

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

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

相关文章

数据中心中什么最重要?

在数据中心中&#xff0c;最重要的要素可以总结为以下几点&#xff1a; 数据安全&#xff1a;数据中心是存储和处理大量敏感数据的关键设施&#xff0c;因此数据安全是最重要的要素之一。数据中心必须采取严格的物理安全措施&#xff0c;如门禁、监控和防火措施&#xff0c;以确…

Stable Diffusion基础:精准控制之ControlNet

在AI绘画中精确控制图片的生成是一件比较困难的事情&#xff0c;炼丹师们经常需要大量抽卡才能得到一张满意的图片&#xff0c;不过随着 ControlNet 的诞生&#xff0c;这一问题得到了很大的缓解。 ControlNet 提供了十几种控制网络模型&#xff0c;有的可以控制画面的结构&…

利用大模型知识图谱技术,告别繁重文案,实现非结构化数据高效管理

我&#xff0c;作为一名产品经理&#xff0c;对文案工作可以说是又爱又恨&#xff0c;爱的是文档作为嘴替&#xff0c;可以事事展开揉碎讲清道明&#xff1b;恨的是只有一个脑子一双手&#xff0c;想一边澄清需求一边推广宣传一边发布版本一边申报认证实在是分身乏术&#xff0…

【uniapp】小程序开发:2 安装uni-ui组件库、使用pinia状态管理、自定义http请求

一、安装uni-ui组件库 1、安装 pnpm i -D sass pnpm i dcloudio/uni-ui2、配置组件自动导入 使用 npm 安装好 uni-ui 之后&#xff0c;需要配置 easycom 规则&#xff0c;让 npm 安装的组件支持 easycom 打开项目根目录下的 pages.json 并添加 easycom 节点&#xff1a; //…

LeetCode 75-03:拥有最多糖果的孩子

func kidsWithCandies(candies []int, extraCandies int) []bool {maxCandy : 0for _, v : range candies{if v > maxCandy{maxCandy v}}res : make([]bool, len(candies))for i,candy : range candies{res[i] candy extraCandies > maxCandy}return res }

对象的生命周期、配置文件参数化、自定义类型转换器

目录 一、对象的生命周期 1、什么是对象的生命周期 2、为什么要学习对象的生命周期 3、生命周期的三个阶段 &#xff08;1&#xff09;创建阶段 &#xff08;2&#xff09;初始化阶段 1、InitializingBean 接口 2、对象中提供一个普通的方法 3、细节分析 &#xff08…

linux离线安装make

一、下载rpm包 https://pkgs.org/search/?qmake 二、拷贝至服务器 三、安装make rpm -ivh make-3.82-24.el7.x86_64.rpm四、查看是否安装成功 make -v

Git 设置公钥

一、公钥管理 1、生成公钥 WinR&#xff0c;输入cmd&#xff0c;打开命令行窗口&#xff0c;执行ssh-keygen命令 查看生成的公钥&#xff0c;使用everything搜索id_rsa.pub&#xff0c;如下&#xff1a; 2、配置公钥 打开服务端网站&#xff0c;添加公钥 3、修改Git Tourtise配…

PostgreSQL 技术内幕(十)WAL log 模块基本原理

事务日志是数据库的重要组成部分&#xff0c;记录了数据库系统中所有更改和操作的历史信息。 WAL log(Write Ahead Logging)也被称为xlog&#xff0c;是事务日志的一种&#xff0c;也是关系数据库系统中用于保证数据一致性和事务完整性的一系列技术&#xff0c;在数据库恢复、高…

Ubuntu 安装golang

目录 1. 从官方网站下载合适的安装包 2. 解压安装包 3. 设置环境变量 4. 验证安装是否成功 1. 从官方网站下载合适的安装包 到官网&#xff1a;https://go.dev/dl/查找对应的版本 # 下载golang对应的版本 wget https://dl.google.com/go/go1.14.4.linux-amd64.tar.gz 2. …

PM2.5 激光粉尘传感器之DSL-08(DS-08)

一款产品里用到粉尘检测&#xff0c;最后在淘宝上找一到了一款&#xff0c;攀藤型号是&#xff1a;PMS9003 还有一款外形类似型号是DSL-08。看了资料是可以通用的。 传感器的产品资料放在百度网盘里 链接&#xff1a;https://pan.baidu.com/s/1oNCwO7n9oEdzju91cF99xg?pwd12…

PX4 通过 Vision 实现 Position、Altitude 和 Offboard 模式

本文通过 VINS-Fusion 的里程计信息为 PX4 提供视觉信息&#xff0c;从而达到 视觉定高和定点 的目的 主要工作为创建一个将 vins 里程计信息发布给 Mavros 的 /mavros/vision_pose/pose 话题 首先创建一个工作空间 mkdir -p ~/catkin_ws/src/vision_to_mavros/src/ cd ~/ca…

使用Java将PPT、PPTX和PDF转换为图片

从Office到图片—使用Java实现文件格式转换 PDF转图片1. 万事第一步2. 撸代码 PPT/PPTX转图片1. 万事第一步2. 撸代码验收一下 最近小雨遇到了一个需求&#xff0c;需要在前端小程序中嵌入展示Office文件的功能。然而&#xff0c;前端使用开源组件进行在线预览会导致性能消耗较…

PostgreSQL设置主键为自增

1、创建自增序列 CREATE SEQUENCE table_name_id_seq START 1; 2、设置字段默认值 字段默认值中设置 nextval(table_name_id_seq) 3、常用查询 -- 查询所有序列 select * from information_schema.sequences where sequence_schema public; -- 查询自增序列的当前值 select cu…

【分布式计算】七、同步 synchronization 重难点

两个协议&#xff1a; 1、NTP&#xff08;Network Time Protocal)–>广泛使用    机器周期向时间服务器获取准确时间   2、没有协议名称 − > -> −>没有广泛使用    时间服务器周期扫描所有机器&#xff0c;计算时间平均值&#xff1b;导致时间服务器负载…

Mac使用sz/rz

从使用体验上说,sz/rz要比scp要好得多.但Mac上使用这两个命令需要进行相应配置. sz&#xff1a;将选定的文件发送&#xff08;send&#xff09;到本地机器 rz&#xff1a;运行该命令会弹出一个文件选择窗口&#xff0c;从本地选择文件上传到Linux服务器 下载安装lrzsz brew i…

小红书“不误正夜”指南丨2023夜间营销数据报告

对于当代年轻人来说&#xff0c;白天的 8 小时需要献给工作、学习和社交&#xff0c;夜晚时光才真正属于自己。“下班后开始新的一天”&#xff0c;越来越多人开始认同这个概念&#xff0c;告别“报复性熬夜”&#xff0c;重新掌握晚间生活的方向盘&#xff0c;多样化的生活方式…

芯片核数造假,华为不装了,网友直呼这一波赚翻了!

首先说一下之前以为华为是青岛新恩制作的芯片&#xff0c;但是在最新的一个消息中发现&#xff0c;麒麟芯片其实是华为子公司自主研发生产的。 2个重量级消息&#xff0c;华为突破芯片封锁后&#xff0c;美国科技界惊出一身冷汗&#xff01; 华为麒麟9000s是中芯国际做的吗&…

Linux-Nginx安装

一、Nginx下载 官网下载地址&#xff1a; https://nginx.org/en/download.html 国内镜像地址&#xff1a; https://mirrors.huaweicloud.com/nginx 二、Nginx安装 1. 将下载的Nginx安装包上传到Linux服务器指定安装盘符下&#xff0c;解压zip包 tar -zxvf nginx-1.23.3.ta…

使用亚马逊云服务器在 G4 实例上运行 Android 应用程序

随着 Android 应用程序和游戏变得越来越丰富&#xff0c;其中有些甚至比 PC 上的软件更易于使用和娱乐&#xff0c;因此许多人希望能够在云上运行 Android 游戏或应用程序&#xff0c;而在 EC2 实例上运行 Android 的解决方案可以让开发人员更轻松地测试和运行 Android 应用程序…