首页 > 其他分享 >【rabbitMQ】-延迟队列-模拟控制智能家居的操作指令

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

时间:2023-05-26 20:46:46浏览次数:27  
标签:执行命令 队列 扫地机 智能家居 rabbitMQ 交换机 var channel

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

 

二.如何设置延迟队列?

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,交换机,var,channel
From: https://www.cnblogs.com/menglin2010/p/17435656.html

相关文章

  • RabbitMQ---死信交换机
    什么是死信交换机?要先解释一下什么是死信:当一个队列中的消息满足下列情况之一。就可称为死信。消费者使用basic.reject或basic.nack声明消费失败,并且消息的requeue参数设置为false消息是一个过期消息,超时无人消费要投递的队列消息满了,无法投递如果这个包含死信的队列配置了......
  • windows安装RabbitMQ及出现问题处理方法
    一、安装准备工具1.下载Eralng,下面链接已提供otp_win64_20.2.exe链接:https://pan.baidu.com/s/1lmvCMPVAV1Ba9UogCdQpZg提取码:x9m7注意:有32位版本 otp_win32_21.3.exe 根据win系统而定2.下载rabbitmq,下面链接已提供rabbitmq-server-3.7.4.exe链接:https://pan.baidu.com/s/1......
  • 看完这篇文章,rabbitmq终于安装起来了!
    文章目录1、下载2、启动3、注意事项1、下载rabbitmq下载地址:http://www.rabbitmq.com/download.htmlErlang下载地址:http://erlang.org/download/otp_win64_22.1.exe先安装erlang,再安装rabbimq。不出意外的话安装是很顺利的。2、启动点击这个启动rabbtimq。再找到这个进入......
  • 【❧消息队列】解析 RocketMQ 业务消息——“事务消息”
    在分布式系统调用场景中存在这样一个通用问题,即在执行一个核心业务逻辑的同时,还需要调用多个下游做业务处理,而且要求多个下游业务和当前核心业务必须同时成功或者同时失败,进而避免部分成功和失败的不一致情况出现。简单来说,消息队列中的“事务”,主要解决的是消息生产者和消费者的......
  • RabbitMQ的消息可靠性
    RabbitMQ如何保证消息可靠性?1.开启生产者确认机制,确保生产者的消息能到达队列。2.开启持久化功能,确保消息未消费前在队列中不会丢失。3.开启消费者确认机制为auto,由Spring确认消息处理成功后完成ack。4.开启消费者失败重试机制,并设置MessageRecoverer,多次重试失败后将消息投递......
  • IBM MQ - 连接远程队列管理器报AMQ4036错误
    解决方法: 首先确定好服务器连接通道是否正常,如SERVER_CHL;修改其相关属性: ALTERCHL('SERVER_CHL')CHLTYPE(SVRCONN)MCAUSER('mqm')以上的意思是为其创建一个mqm的用户标识。然后再连接该远程队列管理器时,在属性用户标识中填写mqm......
  • rabbitmq中的queueDeclare方法
    queueDeclareQueue.DeclareOkqueueDeclare()throwsIOException;/***Declareaqueue*@seecom.rabbitmq.client.AMQP.Queue.Declare*@seecom.rabbitmq.client.AMQP.Queue.DeclareOk*@paramqueuethenameofthequeue*@param......
  • RabbitMQ消费消息方法basicConsume
    RabbitMQ-消费消息 Address[]addresses=newAddress[]{newAddress(IP_ADDRESS,PORT)};/***1.建立连接工厂*/ConnectionFactoryconnectionFactory=newConnectionFactory();connectionFactory.setUsername(USER_NAME);......
  • 【消息队列】概览
    消息队列作用:解耦、异步、削峰(大促)引入的问题:如何保证消息的高可用如何保证消息消费的幂等性如何处理消息丢失问题如何保证消息的顺序性如何解决消息积压如何保持数据一致需关注的技术实现:1、存储模型:如何快速的读写 ......
  • RabbitMQ之消息确认机制
    RabbitMQ之消息确认机制标签(空格分隔):php,rabbitmq在使用RabbitMQ的时候,我们可以通过消息持久化操作来解决因为服务器的异常奔溃导致的消息丢失,除此之外我们还会遇到一个问题,当消息的发布者在将消息发送出去之后,消息到底有没有正确到达broker代理服务器呢?如果不进行特殊配置的话......