1.生产-消费模式 (单)

场景: 主办方(生产者)发布一个消息或者一个计划  到 rabbitmq,    客户(消费者)预定这个计划 从rabbitmq
生产者代码:

        [HttpPost]
        public string CreatePlan(PlaninfoDto planinfo)
        {
            //创建RabbitMQ工厂
            ConnectionFactory factory = new ConnectionFactory()
            {
                HostName = "127.0.0.1",
                Port = 5672,
                UserName = "guest",
                Password = "guest",
                VirtualHost = "/"
            };
            //创建 连接 
            IConnection connection = factory.CreateConnection();

            //创建 通道 
            //IModel createModel = connection.CreateModel();
            var channel = connection.CreateModel();
            //创建队列
            channel.QueueDeclare(queue: "create-PlanInfo", //队列名称ID
                                     durable: false, //是否持久化,false对应不持久化数据,MQ停掉数据就会丢失
                                     exclusive: false,//是否队列私有化,false则代表所有的消费者都可以访问,true代表只有第一次拥有它的消费者才能一直使用
                                     autoDelete: false, //是否自动删除,false代表连接停掉后不自动删除这个队列
                                     arguments: null //其他额外参数
                                     );
            //创建发送到队里信息里内容
            string planinfoJson = JsonConvert.SerializeObject(planinfo);
            byte[] bobyByte = Encoding.UTF8.GetBytes(planinfoJson);

            //发送消息内容
            IBasicProperties properties = channel.CreateBasicProperties();
            properties.Persistent = true;// 这里也可以设置消息持久化

            //channel.ConfirmSelect();

            channel.BasicPublish(
                        exchange: "",
                        routingKey: "create-PlanInfo",
                        basicProperties: properties,
                        body: bobyByte
                    );

            Console.WriteLine($"主办方:发布一个计划{planinfo.PlanNo} --{planinfo.PlanName} 创建成功!!!");

            logger.LogInformation("主办方:预约的计划创建成功!!!");
        
            return "ok";
        }

 /// <summary>
 /// 计划信息
 /// </summary>
 public class PlaninfoDto
 {
     /// <summary>
     /// 计划号
     /// </summary>
     public string PlanNo { get; set; }

     /// <summary>
     /// 计划名称
     /// </summary>
     public string PlanName { get; set; }
 }

消费者代码:

        [HttpGet]
        public ReceiveStatus Consumption()
        {
            Method1();
            var rec = new ReceiveStatus();
            return rec;
        }

 /// <summary>
 /// 单消费者
 /// </summary>
 public void Method1()
 {
     //1. 创建工厂
     var factory = new ConnectionFactory()
     {
         HostName = "127.0.0.1",
         Port = 5672,
         UserName = "guest",
         Password = "guest",
         VirtualHost = "/"

     };

     //创建连接
     var connection = factory.CreateConnection();
     //创建通道
     var channel = connection.CreateModel();

     //定义队列
     channel.QueueDeclare(queue: "create-PlanInfo",
                             durable: false,
                             exclusive: false,
                             autoDelete: false,
                             arguments: null
                             );

     //创建 事件基本消费者
     var consumer = new EventingBasicConsumer(channel);
     //接收到消息事件
     consumer.Received += (model, ea) =>
     {
         var message = Encoding.UTF8.GetString(ea.Body.ToArray());
         Console.WriteLine($"客户消费者 预定: {message}");

         //.....逻辑代码

     };
     channel.BasicConsume(queue: "",
                         autoAck: true,//自动消息确认
                         consumer: consumer
                         );
 }

 通过 命令行 启动程序 (dotnet run)


——————
   发布

           

 消费

       

 生产者将消息发送到队列,消费者从队列中获取消息,队列是存储消息的缓冲区!

 

posted @ 2025-05-29 10:14  逆流而下  阅读(14)  评论(0)    收藏  举报