【rabbitMQ】-延遲隊列-模擬控制智能家居的操作指令

這個需求爲控制智能家居工作,把控制智能家居的操作指令發到隊列中,比如:掃地機、洗衣機到指定時間工作
 
一.什麼是延遲隊列?
延遲隊列存儲的對象是對應的延遲消息,所謂“延遲消息” 是指當消息被髮送以後,並不想讓消費者立刻拿到消息,而是等待特定時間後,消費者才能拿到這個消息進行消費。

 

二.如何設置延遲隊列?

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

                }
            }
        }
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章