RabbitMQ消息队列的发布-消费

1. 生产者 

RabbitMQ_Producer

    static void Main(string[] args)
        {
            string path = AppDomain.CurrentDomain.BaseDirectory;
            string tag = path.Split('/', '\\').Last(s => !string.IsNullOrEmpty(s));
            Console.WriteLine($"这里是 {tag} 启动了。。");



            var factory = new ConnectionFactory();
            factory.HostName = "localhost";//主机名,Rabbit会拿这个IP生成一个endpoint,这个很熟悉吧,就是socket绑定的那个终结点。
            factory.UserName = "guest";//默认用户名,用户可以在服务端自定义创建,有相关命令行
            factory.Password = "guest";//默认密码

            using (var connection = factory.CreateConnection())//连接服务器,即正在创建终结点。
            {
                //创建一个通道,这个就是Rabbit自己定义的规则了,如果自己写消息队列,这个就可以开脑洞设计了
                //这里Rabbit的玩法就是一个通道channel下包含多个队列Queue
                using (var channel = connection.CreateModel())
                {
                    //删除队列
                    channel.QueueDelete("ProducerWrites");
                    //删除交换机
                    channel.ExchangeDelete("ProducerWritesExChange");
                    

                    //创建队列
                    channel.QueueDeclare(queue: "ProducerWrites", durable: true, exclusive: false, autoDelete: false, arguments: null);

                    //创建交换机
                    channel.ExchangeDeclare(exchange: "ProducerWritesExChange", type: ExchangeType.Direct, durable: true, autoDelete: false, arguments: null);

                    //交换机和队列绑定
                    channel.QueueBind(queue: "ProducerWrites", exchange: "ProducerWritesExChange", routingKey: "advanced", arguments: null);
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.WriteLine($"生产者{tag}已准备就绪~~~");

                    // 1. 生产消息
                    for (int i = 0; true; i++)
                    {
                        IBasicProperties basicProperties = channel.CreateBasicProperties();
                        basicProperties.Persistent = true;
                        //basicProperties.DeliveryMode = 2;
                        string message = $"{tag}:生产者生产消息_{i + 1}";
                        byte[] body = Encoding.UTF8.GetBytes(message);
                        Encoding.UTF8.GetBytes(message);
                        channel.BasicPublish(exchange: "ProducerWritesExChange",
                                          routingKey: "advanced",
                                          basicProperties: basicProperties,
                                          body: body);
                        Console.WriteLine($"{message} 已发送~");
                        Thread.Sleep(500);
                    }            
                
                }
            }
          
        }

2. 消费者

RabbitMQ_Consumer

  static void Main(string[] args)
        {
            string path = AppDomain.CurrentDomain.BaseDirectory;
            string tag = path.Split('/', '\\').Last(s => !string.IsNullOrEmpty(s));
            Console.WriteLine($"这里是 {tag} 启动了。。");

            var factory = new ConnectionFactory();
            factory.HostName = "localhost";//RabbitMQ服务在本地运行
            factory.UserName = "guest";//用户名
            factory.Password = "guest";//密码 
            using (var connection = factory.CreateConnection())
            {
                using (var channel = connection.CreateModel())
                {
                    Console.ForegroundColor = ConsoleColor.Green;
                    try
                    {
                        channel.QueueDeclare(queue: "ProducerWrites", durable: true, exclusive: false, autoDelete: false, arguments: null);
                        channel.ExchangeDeclare(exchange: "ProducerWritesExChange", type: ExchangeType.Direct, durable: true, autoDelete: false, arguments: null);
                        channel.QueueBind(queue: "ProducerWrites", exchange: "ProducerWritesExChange", routingKey: "advanced", arguments: null);

                        //2. 消费消息
                        //rabbitMq消费消息是通过事件驱动的:
                        var consumer = new EventingBasicConsumer(channel);
                        consumer.Received += (model, ea) =>  //如果有消息进入到Rabbitmq,就会触发这个事件来完成消息的消费;
                        {
                            var body = ea.Body;
                            var message = Encoding.UTF8.GetString(body.ToArray());
                            Console.WriteLine($"{tag}接受消息: {message}");
                        };
                        channel.BasicConsume(queue: "ProducerWrites",
                                     autoAck: true,
                                     consumer: consumer);
                        Console.WriteLine(" Press [enter] to exit.");
                        Console.ReadLine();
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.Message);
                    }
                }
            }
        }

3. 准备1个生产者,2个消费者效果图

 

posted @ 2021-05-14 21:32  明志德道  阅读(161)  评论(0编辑  收藏  举报