二.如何設置延遲隊列?
1.配置2個業務隊列(掃地機執行命令業務隊列,洗衣機執行命令業務隊列),綁定到業務交換機上
2.爲業務隊列配置死信交換機和路由key
三.延遲隊列代碼落地
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); } } } } } }