RabbitMQ .NET消息队列

实体类:
DocumentType.cs
  public enum DocumentType
    {
        //日志
        Journal = 1,
        //论文
        Thesis = 2,
        //会议文件
        Meeting = 3
    }


MessageModel.cs
 public class MessageModel
    {
        public string Title { get; set; }
        public string Author { get; set; }
        public DocumentType DocType { get; set; }

        public override string ToString()
        {
            return Title;   
        }

        /// <summary>
        /// 验证消息,Title与Author不能为空
        /// </summary>
        /// <returns></returns>
        public bool IsVlid()
        {
            return !string.IsNullOrWhiteSpace(Title) && !string.IsNullOrWhiteSpace(Author);
        }
    }

异常代码类MessageException.cs:
 public class MessageException : Exception
    {
        public MessageException(string message) : base(message)
        {
        }

        public MessageException(string message, Exception innerException) : base(message, innerException)
        {
        }
    }

    public class NoRPCConsumeException : Exception
    {
        public NoRPCConsumeException(string message) : base(message)
        {
        }

        public NoRPCConsumeException(string message, Exception innerException) : base(message, innerException)
        {
        }
    }


①第一个控制台应用程序
namespace PCApp
{
    class Program
    {
        private static IConnection _senderConnection;
        private static IModel _channel;
        private static int _interval = 1; //消息发送间隔
        private static bool isExit;

        private static void Main(string[] args)
        {
            Setup();

            Console.WriteLine("准备发送消息到extractQueue队列:");

            Send();

            WaitCommand();
        }

        /// <summary>
        ///     初始化
        /// </summary>
        private static void Setup()
        {
            var factory = new ConnectionFactory
            {
                HostName = "localhost",
                UserName = "guest",
                Password = "guest",
                // virtual host只是起到一个命名空间的作用,所以可以多个user共同使用一个virtual host,
                //vritual_host= '/',这个是系统默认的,就是说当我们创建一个到rabbitmq的connection时候,它的命名空间是'/',需要注意的是不同的命名空间之间的资源是不能访问的,比如 exchang,queue ,bingding等
                //VirtualHost = "test",
                AutomaticRecoveryEnabled = true,
                TopologyRecoveryEnabled = true
            };

            try
            {
                _senderConnection = factory.CreateConnection();
                _senderConnection.ConnectionShutdown += _senderConnection_ConnectionShutdown;

                _channel = _senderConnection.CreateModel();
                _channel.QueueDeclare("extractQueue", false, false, false, null);
            }
            catch (BrokerUnreachableException ex)
            {
                Console.WriteLine("ERROR: RabbitMQ服务器未启动!");
                Thread.Sleep(2000);
                isExit = true;
            }
        }

        private static void _senderConnection_ConnectionShutdown(object sender, ShutdownEventArgs e)
        {
            Console.WriteLine("连接已关闭. " + e.ReplyText);
        }

        /// <summary>
        /// 等待接收指令
        /// </summary>
        private static void WaitCommand()
        {

            while (!isExit)
            {
                string line = Console.ReadLine().ToLower().Trim();
                string[] arr = line.Split(new[] {' '});
                string cmd = arr[0];
                switch (cmd)
                {
                    case "exit":
                        Close();
                        isExit = true;
                        break;
                    case "go":
                        int count = 10;
                        if (arr.Length > 1)
                        {
                            int.TryParse(arr[1], out count);
                        }

                        Send(count);
                        break;
                    case "interval":
                        int.TryParse(arr[1], out _interval);
                        break;
                    case "clear":
                        Console.Clear();
                        break;
                    default:
                        break;
                }
            }

            Console.WriteLine("Goodbye!");
        }

        public static void Send(int msgCount = 10)
        {

            Console.WriteLine("---------- 开始发送------------");

            for (int i = 1; i <= msgCount; i++)
            {
                string title = "测试文档" + i;
                string author = "lexworld" + i;
                int docType = i%2 + 1;
                string jsonFormat = "{{\"Title\":\"{0}\",\"Author\":\"{1}\",\"DocType\":{2}}}";
                string message = string.Format(jsonFormat, title, author, docType);
                byte[] body = Encoding.UTF8.GetBytes(message);
                try
                {
                    _channel.BasicPublish("", "extractQueue", null, body);
                }
                catch (AlreadyClosedException ex)
                {
                    Console.WriteLine("ERROR: " + ex.Message);
                    break;
                }

                Console.WriteLine("Time:" + DateTime.Now + " MSG:" + title);

                if (_interval > 0)
                {
                    Thread.Sleep(_interval*1000);
                }
            }

            Console.WriteLine("---------- 结束 ------------");
        }

        private static string GetMessage()
        {
            string argLine = string.Join(" ", Environment.GetCommandLineArgs());
            string args = argLine.Substring(argLine.IndexOf(" ") + 1);
            Console.WriteLine("args:" + args);
            string[] arr = args.Split(new[] {','});
            string jsonFormat = "{{\"Title\":\"{0}\",\"Author\":\"{1}\",\"DocType\":{2}}}";

            return string.Format(jsonFormat, arr[0], arr[1], arr[2]);
        }

        private static void Close()
        {
            if (_channel != null && _channel.IsOpen)
            {
                _channel.Close();
            }

            if (_senderConnection != null && _senderConnection.IsOpen)
            {
                _senderConnection.Close();
            }
        }
    }
}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RabbitMQ延迟消息队列是一种在消息发送后延迟一段时间才能被消费的机制。它可以通过设置消息的TTL(Time To Live)属性来实现。然而,使用TTL属性设置的方式可能存在一些问题。例如,RabbitMQ只会检查第一个消息是否过期,如果第一个消息的延时时长较长,而第二个消息的延时时长较短,则第二个消息并不会优先得到执行。 为了解决这个问题,可以使用RabbitMQ插件来实现延迟队列。具体来说,可以选择适合自己RabbitMQ版本的插件,比如[rabbitmq-delayed-message-exchange](https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/releases)。这个插件可以在RabbitMQ中创建一个延迟交换器(Delayed Exchange),通过在消息发送时指定延迟时间以及目标交换器,将消息发送到延迟交换器中。然后,延迟交换器会根据指定的延迟时间将消息转发到目标交换器,从而实现延迟消息队列的功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [RabbitMQ-延迟队列](https://blog.csdn.net/qq_44128703/article/details/125251438)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [【RabbitMq04】延迟队列](https://blog.csdn.net/weixin_40964170/article/details/119214296)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值