

【rabbitMQ】-延迟队列-模拟控制智能家居的操作指令 - David.Meng
source link: https://www.cnblogs.com/menglin2010/p/17435656.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

【rabbitMQ】-延迟队列-模拟控制智能家居的操作指令
二.如何设置延迟队列?
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); } } } } } }
Recommend
-
99
Rabbitmq延迟队列实现定时任务
-
52
作者: 海向 出处:https://www.cnblogs.com/haixiang/p/10966985.html ...
-
24
本文收录在个人博客: www.chengxy-nds.top ,共享技术资源,共同进步 前一段有幸参与到一个智能家居项目的开发,由于之前都没有过这方面的开发经验,所以对智能硬件的开发模式和技...
-
15
最近开发一个活动功能,需要在活动结束后给榜单 Top10 用户发放奖励。由于活动的榜单是通过 RabbitMQ 进行异步统计分值排名的,因此在活动结束时队列中可能还存在消息未消费完全,排名不准确,此时发放活动奖励必然会出错。 那么,如果...
-
16
RabbitMQ-延迟队列 - 张铁牛 - 博客园我们在上一篇博文中遗留了一个小问题,就是虽然TTL + DLX能实现延迟队列的功能,但是有两个问题。 首先业务场景为:比如海底捞预约,每个人预约的时间段不一致,有个可能一个小时后,有的可能三个小时...
-
6
5 天前 RabbitMQ ...
-
12
读本文之前,你应该已经了解 RabbitMQ 的一些概念,如队列、交换机之类。延迟队列简介一个队列中的消息在延迟一段时间后才被消费者消费,这样的队列可以称之为延迟队列。延迟队列的应用场景十分广泛,如:下单...
-
13
延迟任务应用广泛,延迟任务典型应用场景有订单超时自动取消;支付回调重试。其中订单超时取消具有幂等性属性,无需考虑重复消费问题;支付回调重试需要考虑重复消费问题。 延迟任务具有如下特点:在未来的某个时间点执行;一...
-
11
前段时间写过一篇: # RabbitMQ:消息丢失 | 消息重复 | 消息积压的原因+解决方案+网上学不到的使用心得 很多人加了我好友,说很喜欢这篇文章,...
-
14
延迟队列在实际项目中有非常多的应用场景,最常见的比如订单未支付,超时取消订单,在创建订单的时候发送一条延迟消息,达到延迟时间之后消费者收到消息,如果订单没有支付的话,那么就取消订单。 那么,今天我们需要来谈的问题就是RabbitMQ、RocketMQ、Kafka...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK