• rabbitmq系列——(3 优先级 )


      (1)消费消息失败后,重新加入队列并优先级处理;

      (2)根据消息的内容筛选出优先级高的进行设置,并发送

    1. 生产者

    using RabbitMQMsgProducer.MessageProducer;
    using Microsoft.Extensions.Configuration;
    using System;
    using System.IO;
    
    namespace RabbitMQMsgProducer
    {
        class Program
        {
            static void Main(string[] args)
            {
                try
                {
                    {
                        // 优先级
                        // 1. 消费消息失败后,重新加入队列并优先级处理
                        PriorityMsg.Send01();
                    }
                    {
                        // 优先级
                        // 2. 根据消息的内容筛选出优先级高的进行设置,并发送
                        //PriorityMsg.Send02();
                    }
                    Console.ReadLine();
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }
        }
    }
    using RabbitMQ.Client;
    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace RabbitMQMsgProducer.MessageProducer
    {
        public class PriorityMsg
        {
            /// <summary>
            /// 消费消息失败后,重新加入队列并优先级处理
            /// </summary>
            public static void Send01()
            {
                ConnectionFactory connectionFactory = new ConnectionFactory();
                connectionFactory.HostName = "localhost";
                connectionFactory.UserName = "guest";
                connectionFactory.Password = "guest";
                string queueName = "PriorityMsgQueue";
                string exchangeName = "PriorityMsgExchange";
                string routingKeyName = "PriorityKey";
                using (IConnection connection = connectionFactory.CreateConnection())
                {
                    using (IModel channel = connection.CreateModel())
                    {
                        // 声明exchange
                        channel.ExchangeDeclare(exchange: exchangeName, type: ExchangeType.Direct, durable: true, autoDelete: false, arguments: null);
                        // 声明队列
                        // x-max-priority 指定队列的优先级设置,必须的
                        channel.QueueDeclare(queue: queueName, durable: true, exclusive: false, autoDelete: false, arguments: new Dictionary<string, object>()
                        {
                            {"x-max-priority",10 }
                        });
                        // 绑定
                        channel.QueueBind(queue: queueName, exchange: exchangeName, routingKey: routingKeyName);
    
                        IBasicProperties props = channel.CreateBasicProperties();
                        props.DeliveryMode = 2;
                        int i = 1;
                        while (true)
                        {
                            props.Priority = 1; // 设置优先级
                            string msg = $"the message is {i}";
                            channel.BasicPublish(exchange: exchangeName, routingKey: routingKeyName, basicProperties: props, body: Encoding.UTF8.GetBytes(msg));
                            Console.WriteLine($"{msg} is send.");
                            i++;
                            if (i > 29)
                            {
                                break;
                            }
                        }
                        Console.WriteLine("press [enter] exit.");
                        Console.Read();
                    }
                }
            }
    
            /// <summary>
            /// 根据消息的内容筛选出优先级高的进行设置,并发送
            /// </summary>
            public static void Send02()
            {
                ConnectionFactory connectionFactory = new ConnectionFactory();
                connectionFactory.HostName = "localhost";
                connectionFactory.UserName = "guest";
                connectionFactory.Password = "guest";
                string queueName = "PriorityMsgQueue";
                string exchangeName = "PriorityMsgExchange";
                string routingKeyName = "PriorityKey";
                using (IConnection connection = connectionFactory.CreateConnection())
                {
                    using (IModel channel = connection.CreateModel())
                    {
                        // 声明exchange
                        channel.ExchangeDeclare(exchange: exchangeName, type: ExchangeType.Direct, durable: true, autoDelete: false, arguments: null);
                        // 声明队列
                        // x-max-priority 指定队列的优先级设置,必须的
                        channel.QueueDeclare(queue: queueName, durable: true, exclusive: false, autoDelete: false, arguments: new Dictionary<string, object>()
                        {
                            {"x-max-priority",10 }
                        });
                        // 绑定
                        channel.QueueBind(queue: queueName, exchange: exchangeName, routingKey: routingKeyName);
    
                        string[] msgList =
                        {
                            "顶头上司 给你一个任务1",
                            "1部门领导 约你沟通问题",
                            "2部门领导 约你沟通问题",
                            "3部门领导 约你沟通问题",
                            "人力 谈谈涨薪",
                            "顶头上司 给你一个任务2",
                        };
                        IBasicProperties props = channel.CreateBasicProperties();
                        foreach (string msg in msgList)
                        {
                            ////没有优先级这样写
                            //channel.BasicPublish(exchange: exchangeName, routingKey: routingKeyName, basicProperties: null, body: Encoding.UTF8.GetBytes(msg));
                            if (msg.StartsWith("顶头上司"))
                            {
                                props.Priority = 10;
                            }
                            else if (msg.Contains("涨薪"))
                            {
                                props.Priority = 9;
                            }
                            else
                            {
                                props.Priority = 1;
                            }
                            channel.BasicPublish(exchange: exchangeName, routingKey: routingKeyName, basicProperties: props, body: Encoding.UTF8.GetBytes(msg));
                            Console.WriteLine($"{msg} is send.");
                        }
                        Console.WriteLine("press [enter] exit.");
                        Console.Read();
                    }
                }
            }
        }
    }

    2. 消费者

    using RabbitMQMsgProducer.MessageProducer;
    using Microsoft.Extensions.Configuration;
    using System;
    using System.IO;
    
    namespace RabbitMQMsgProducer
    {
        class Program
        {
            static void Main(string[] args)
            {
                try
                {
                    {
                        // 优先级
                        // 1. 消费消息失败后,重新加入队列并优先级处理
                        PriorityMsg.Send01();
                    }
                    {
                        // 优先级
                        // 2. 根据消息的内容筛选出优先级高的进行设置,并发送
                        //PriorityMsg.Send02();
                    }
                    Console.ReadLine();
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }
        }
    }
    using RabbitMQ.Client;
    using RabbitMQ.Client.Events;
    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace RabbitMQMsgConsumer001.MessageConsumer
    {
        public class PriorityMsg
        {
            /// <summary>
            /// 消费消息失败后,重新加入队列并优先级处理
            /// </summary>
            public static void Receive01()
            {
                ConnectionFactory connectionFactory = new ConnectionFactory();
                connectionFactory.HostName = "localhost";
                connectionFactory.UserName = "guest";
                connectionFactory.Password = "guest";
                string queueName = "PriorityMsgQueue";
                string exchangeName = "PriorityMsgExchange";
                string routingKeyName = "PriorityKey";
                using (IConnection connection = connectionFactory.CreateConnection())
                {
                    using (IModel channel = connection.CreateModel())
                    {
                        EventingBasicConsumer consumer = new EventingBasicConsumer(channel);
                        consumer.Received += (model, ea) =>
                        {
                            string msg = Encoding.UTF8.GetString(ea.Body.ToArray());
                            Console.WriteLine($"the consumer receive {msg}");
                            if(msg.Equals("the message is 1"))
                            {
                                // 这里重新删除消息队列中消息,并重新设置消息优先级,写入队列
                                // 消息默认队列优先级是1,重新写入设置为10。
                                //否定:告诉Broker,这个消息我没有正常消费;  requeue: true:重新写入到队列里去; false:你还是删除掉;
                                channel.BasicReject(deliveryTag: ea.DeliveryTag, requeue: false);
    
                                ///设置消息优先级最高 重新写入到队列中去
                                IBasicProperties props = channel.CreateBasicProperties();
                                props.Priority = 10;
                                channel.BasicPublish(exchange: exchangeName, routingKey: routingKeyName, basicProperties: props, body: Encoding.UTF8.GetBytes(msg + "double.."));
                            }
                            else
                            {
                                //手动确认  消息正常消费  告诉Broker:你可以把当前这条消息删除掉了
                                channel.BasicAck(deliveryTag: ea.DeliveryTag, multiple: false);
                            }
                        };
                        Console.WriteLine("the consumer is ready.");
                        //处理消息 
                        //autoAck: false  显示确认;
                        channel.BasicConsume(queue: queueName, autoAck: false, consumer: consumer);
                        Console.ReadKey();
                    }
                }
            }
    
            /// <summary>
            /// 根据消息的内容筛选出优先级高的进行设置,并发送
            /// </summary>
            public static void Receive02()
            {
                ConnectionFactory connectionFactory = new ConnectionFactory();
                connectionFactory.HostName = "localhost";
                connectionFactory.UserName = "guest";
                connectionFactory.Password = "guest";
                string queueName = "PriorityMsgQueue";
                string exchangeName = "PriorityMsgExchange";
                string routingKeyName = "PriorityKey";
                using (IConnection connection = connectionFactory.CreateConnection())
                {
                    using (IModel channel = connection.CreateModel())
                    {
                        EventingBasicConsumer consumer = new EventingBasicConsumer(channel);
                        consumer.Received += (model, ea) =>
                        {
                            string msg = Encoding.UTF8.GetString(ea.Body.ToArray());
                            Console.WriteLine($"the consumer receive {msg}");
                            //手动确认  消息正常消费  告诉Broker:你可以把当前这条消息删除掉了
                            channel.BasicAck(deliveryTag: ea.DeliveryTag, multiple: false);
                        };
                        Console.WriteLine("the consumer is ready.");
                        //处理消息 
                        //autoAck: false  显示确认;
                        channel.BasicConsume(queue: queueName, autoAck: false, consumer: consumer);
                        Console.ReadKey();
                    }
                }
            }
        }
    }

    3. 结果

      消费消息失败后,重新加入队列并优先级处理;

     4. 结果

       根据消息的内容筛选出优先级高的进行设置,并发送

  • 相关阅读:
    Swift -- Swfit 笔记
    web -- CSS 图片宽高不固定的垂直居中方法
    web -- Angularjs 笔记2
    web -- Angularjs 笔记
    web -- Angularjs 备忘录应用
    Swift -- swift 函数代码
    Swift -- 创建空数组和空字典
    Linux -- FresBSD的镜像文件说明
    Linux -- ubuntu下安装程序的三种方法
    Linux -- Ubuntu 命令2
  • 原文地址:https://www.cnblogs.com/Fletcher/p/14172806.html
Copyright © 2020-2023  润新知