这个需求为控制智能家居工作,把控制智能家居的操作指令发到队列中,比如:扫地机、洗衣机到指定时间工作
 
一.什么是延迟队列?
延迟队列存储的对象是对应的延迟消息,所谓“延迟消息” 是指当消息被发送以后,并不想让消费者立刻拿到消息,而是等待特定时间后,消费者才能拿到这个消息进行消费。

二.如何设置延迟队列?

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);
} }
}
}
}
}

【rabbitMQ】-延迟队列-模拟控制智能家居的操作指令的更多相关文章

  1. C# RabbitMQ延迟队列功能实战项目演练

    一.需求背景 当用户在商城上进行下单支付,我们假设如果8小时没有进行支付,那么就后台自动对该笔交易的状态修改为订单关闭取消,同时给用户发送一份邮件提醒.那么我们应用程序如何实现这样的需求场景呢?在之前 ...

  2. RabbitMQ延迟队列

    rabbitmq延迟队列 rabbitmq实现延迟队列用了rabbitmq-delayed-message-exchange插件,需要提前安装,并启用. 原理 其原理是通过Exchange来实现延迟功 ...

  3. RabbitMQ延迟队列插件安装

    RabbitMQ延迟队列插件安装 一.下载插件 下载地址:https://www.rabbitmq.com/community-plugins.html 二.把下载的插件放到指定位置 下载的文件为zi ...

  4. 基于rabbitmq之MQTT协议的智能家居

    智能家居项目 智能可燃气体报警器 产品是一款可燃气体报警器,如果家中燃气泄露浓度到达一定阈值,报警器检测到并上传气体浓度值给后台,后台以电话.短信.微信等方式,提醒用户家中可能有气体泄漏. 用户还可能 ...

  5. Spring Boot (26) RabbitMQ延迟队列

    延迟消息就是指当消息被发送以后,并不想让消费者立即拿到消息,而是等待指定时间后,消费者才拿到这个消息进行消费. 延迟队列 订单业务: 在电商/点餐中,都有下单后30分钟内没有付款,就自动取消订单. 短 ...

  6. rabbitmq延迟队列demo

    1. demo详解 1.1 工程结构: 1.2 pom 定义jar包依赖的版本.版本很重要,rabbit依赖spring,两者必须相一致,否则报错: <properties> <sp ...

  7. C#实现rabbitmq 延迟队列功能

    最近在研究rabbitmq,项目中有这样一个场景:在用户要支付订单的时候,如果超过30分钟未支付,会把订单关掉.当然我们可以做一个定时任务,每个一段时间来扫描未支付的订单,如果该订单超过支付时间就关闭 ...

  8. Spring Boot(十四)RabbitMQ延迟队列

    一.前言 延迟队列的使用场景:1.未按时支付的订单,30分钟过期之后取消订单:2.给活跃度比较低的用户间隔N天之后推送消息,提高活跃度:3.过1分钟给新注册会员的用户,发送注册邮件等. 实现延迟队列的 ...

  9. Spring RabbitMQ 延迟队列

    一.说明 在实际业务场景中可能会用到延时消息发送,例如异步回调失败时的重发机制. RabbitMQ本身不具有延时消息队列的功能,但是可以通过rabbitmq-delayed-message-excha ...

  10. RabbitMQ 延迟队列,消息延迟推送

    目录 应用场景 消息延迟推送的实现 测试结果 应用场景 目前常见的应用软件都有消息的延迟推送的影子,应用也极为广泛,例如: 淘宝七天自动确认收货.在我们签收商品后,物流系统会在七天后延时发送一个消息给 ...

随机推荐

  1. uniapp中easycom用法详解

    Uniapp中的easycom是一种组件自动注册机制,可以让开发者更加方便地使用和管理组件.下面详细介绍下关于easycom使用方法. 什么是easycom? easycom是Uniapp框架提供的一 ...

  2. 为什么wait()需要在同步代码块内使用

    我们还是通过源代码和代码注释来学习这个问题 我们先来看看wait方法的注释,这里截取最根源的native方法给的注释 Causes the current thread to wait until e ...

  3. Sokit(TCP/UDP调试工具)

    下载:http://www.winwin7.com/soft/56522.html#xiazai Sokit中文版是一款免费开源的TCP / UDP 测试(调试)工具,它主要可以用于接收和发送TCP/ ...

  4. STM32 HAL库学习 (2) USART实验

    使用STM32F407 串口:PA9.PA10(利用CH340G驱动) 一. stm32f4xx_hal_uart.c 函数说明 HAL_UART_Init 函数 要使用一个外设首先要对它进行初始化, ...

  5. [ACM]NOIP2011D1T1复现-铺地毯

    逆向考虑即可解决 #include<iostream> using namespace std; const int maxn= 100000 +5; int a[maxn][4];//0 ...

  6. 面对AI的兴起,从人类发展到个人发展,普通人应当如何抉择?

    这一周被各种 AI 卷的不行,从 ChatGPT 4.0 上线到百度文心一言发布会,再到微软的 Microsoft 365 Copilot. 网上有很多人.公众号吐嘈百度,而晓衡接触到的圈子还有一些不 ...

  7. ChatGPT推荐最常用的自动化测试、性能、安全测试工具!

    ChatGPT是一种当前被广泛关注的人工智能技术,它具备生成自然语言的能力,能够完成一些简单的文本生成.对话交互等任务.ChatGPT 算法的出现,打破了以前自然语言处理的瓶颈,使得机器具备了更加贴合 ...

  8. 二进制安装k8s v1.25.4 IPv4/IPv6双栈

    二进制安装k8s v1.25.4 IPv4/IPv6双栈 https://github.com/cby-chen/Kubernetes 开源不易,帮忙点个star,谢谢了 介绍 kubernetes( ...

  9. python类详解

    类封装 继承 多态一静态属性1.静态变量和静态方法都属于类的静态成员,它们与普通的成员变量和成员方法不同,静态变量和静态方法只属于定义它们的类,而不属于某一个对象.2.静态变量和静态方法都可以通过类名 ...

  10. stm32串口烧录程序

    Step1:将BOOT0设置为1,BOOT1设置为0,mcuisp软件不使用STR和DTR烧录 Step2:程序下载完成后,再将BOOT0手动跳帽接GND,复位,这样STM32才可以从Flash中启动 ...