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)



——————
发布

消费

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

浙公网安备 33010602011771号