c# 死信队列demo

这里写自定义目录标题

c#死信队列demo

什么是死信队列呢?举个栗子,把任务设置好过期时间放到一个队列中,等到过期时间到通过交换器,放置到另一个消费队列中。这个栗子只是死信队列的一种应用,原理就是这样:有两个队列,一个用来设置过期条件的队列(可以是单挑消息设置,也可以是整个队列设置),另一个队列是用来接受已经过期的消息,通过配置交换器来接受。

死信队列能干什么呢?首先我们明白死信队列原理是什么,那么我们就可以利用它的特性。如再订单业务延时取消 ,超时未发货自动取消,订单取消前半小时通知提醒等,具有延时任务的地方。

下面来看demo 生产者

using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace mqquartz
{
    class Program
    {
        private static string USER_NAME = "guest";//用户名
        private static string PASSWORD = "guest";//密码

        //队列名称
        //****==================订单延时队列=======================*****//
        //订单延时队列
        private static string DELAY_QUEUE_NAME = "delay-queue-orderOverTime";
        //订单延时消费队列
        private static string CONSUME_QUEUE_NAME = "consume-queue-orderOverTime";
        //订单延时队列死信交换的交换器名称
        private static string EXCHANGENAME = "exchange-orderOverTime";
        //订单延时队列死信的交换器路由key
        private static string ROUTINGKEY = "routingKey-orderOverTime";

        static void Main(string[] args)
        {

            var RAB_FACTORY = new ConnectionFactory();
            RAB_FACTORY.HostName = "127.0.0.1";
            RAB_FACTORY.Port = 5672;
            RAB_FACTORY.UserName = USER_NAME;
            RAB_FACTORY.Password = PASSWORD;

            using (var connection = RAB_FACTORY.CreateConnection())
            {
                var delayChannel = connection.CreateModel();//延时队列连接通道
                var consumerChannel = connection.CreateModel();//消费队列连接通道
                consumerChannel.ExchangeDeclare(EXCHANGENAME, "direct");//创建交换器
                Dictionary<string, object> arg = new Dictionary<string, object>();
                //配置死信交换器
                arg.Add("x-dead-letter-exchange", EXCHANGENAME); //交换器名称
                //死信交换路由key (交换器可以将死信交换到很多个其他的消费队列,可以用不同的路由key 来将死信路由到不同的消费队列去)
                arg.Add("x-dead-letter-routing-key", ROUTINGKEY);
                delayChannel.QueueDeclare(DELAY_QUEUE_NAME, true, false, false, arg);

                /**创建消费队列*/
                consumerChannel.QueueDeclare(CONSUME_QUEUE_NAME, true, false, false, null);
                //参数1:绑定的队列名  参数2:绑定至哪个交换器  参数3:绑定路由key
                consumerChannel.QueueBind(CONSUME_QUEUE_NAME, EXCHANGENAME, ROUTINGKEY);
                //最多接受条数 0为无限制,每次消费消息数(根据实际场景设置),true=作用于整channel,false=作用于具体的消费者
                consumerChannel.BasicQos(0, 10, false);
                int i = 20;
                while (i>0)
                {
                    var body = Encoding.UTF8.GetBytes("你牛逼奥!"+i);
                    var properties = delayChannel.CreateBasicProperties();
                    properties.DeliveryMode = 2;
                    properties.Expiration = "15000";
                    delayChannel.BasicPublish("",DELAY_QUEUE_NAME,properties,body);
                    i--;
                }
            }
        }
    }
}

消费者

using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace consumer
{
    class Program
    {
        static void Main(string[] args)
        {
            var factory = new ConnectionFactory();
            factory.HostName = "localhost";
            factory.UserName = "guest";
            factory.Password = "guest";

            using (var connection = factory.CreateConnection())
            {
                using (var channel = connection.CreateModel())
                {
                    channel.QueueDeclare("consume-queue-orderOverTime", true, false, false, null);

                    var consumer = new EventingBasicConsumer(channel);
                    channel.BasicConsume("consume-queue-orderOverTime", false, consumer);
                    consumer.Received += (model, ea) =>
                    {
                        var body = ea.Body;
                        var message = Encoding.UTF8.GetString(body);
                        Console.WriteLine("已接收: {0}", message);
                        channel.BasicAck(ea.DeliveryTag, false);
                    };
                    consumer.HandleBasicConsumeOk("ok");
                    Console.ReadLine();
                }
            }
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_29798755/article/details/96474507