ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

分布式中间件消息队列(3)---.Net Core 使用rabbitmq

2022-02-21 18:31:08  阅读:142  来源: 互联网

标签:Core false 队列 中间件 rabbitmq 消息 var true channel


一、通过install-package rabbitmq.client命令或nuget安装rabbitmq.client

二、rabbitmq操作

 

#region 1、生产者
                {
                    //1、创建rabbitmq连接
                    var rabbitmqFactory = new ConnectionFactory()
                    {
                        HostName = "localhost",//IP地址
                        Port = 5672,//端口
                        UserName = "admin",//用户账号
                        Password = "admin@123",//密码
                        VirtualHost = "/"
                    };
                    //创建连接对象
                    using (var connection = rabbitmqFactory.CreateConnection())
                    {
                        var channel = connection.CreateModel();//创建连接会话对象
                        string name = "product-create";

                        //2、声明一个队列
                        channel.QueueDeclare(
                            queue: name,//消息队列名称
                            durable: false,//是否持久化,true持久化,队列会保存磁盘,服务器重启时可以保证不丢失相关信息。
                            exclusive: false,//是否排他,true排他的,如果一个队列声明为排他队列,该队列仅对首次声明它的连接可见,并在连接断开时自动删除.
                            autoDelete: false,//是否自动删除。true是自动删除。自动删除的前提是:致少有一个消费者连接到这个队列,之后所有与这个队列连接的消费者都断开时,才会自动删除.
                          arguments: null//设置队列的一些其它参数
                            );
                        string productJson = JsonConvert.SerializeObject(productCreateDto);
                        var body = Encoding.UTF8.GetBytes(productJson);

                        //3、发送消息
                        var properties = channel.CreateBasicProperties();
                        properties.Persistent = true; // 设置消息持久化(个性化控制)
                        channel.BasicPublish(exchange: "",
                                             routingKey: name,
                                             basicProperties: properties,
                                             body: body);
                        connection.Close();
                        channel.Close();
                        _logger.LogInformation("发送消息到rabbitMQ成功");
                    }
                }
                #endregion

 

2.2 消费者

 

 #region 1、工作队列(单消费者)
            {
                var channel = connection.CreateModel();

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

                var consumer = new EventingBasicConsumer(channel);
                consumer.Received += (model, ea) =>
                {

                    Console.WriteLine($"model:{model}");
                    var body = ea.Body;
                    // 1、逻辑代码,添加商品到数据库
                    var message = Encoding.UTF8.GetString(body.ToArray());
                    Console.WriteLine(" [x] 创建商品 {0}", message);
                };

                channel.BasicConsume(queue: "product-create",
                                     autoAck: true, // 消息确认(防止消息重新消费)
                                     consumer: consumer);
            }
            #endregion

 

三、防止消息丢失和消息重复消费

3.1 防止消息丢失

使用消息确认机制

设置消息持久化

channel.QueueDeclare(
queue: name,//消息队列名称
durable: true,//是否持久化,true持久化,队列会保存磁盘,服务器重启时可以保证不丢失相关信息。
exclusive: false,//是否排他,true排他的,如果一个队列声明为排他队列,该队列仅对首次声明它的连接可见,并在连接断开时自动删除.
autoDelete: false,//是否自动删除。true是自动删除。自动删除的前提是:致少有一个消费者连接到这个队列,之后所有与这个队列连接的消费者都断开时,才会自动删除.
arguments: null//设置队列的一些其它参数
);

3.2 防止消息重复消费

autoAck设置为true,设置消息消费应答机制,不会导致消息堆积;
如果autoAck为false就会产生消息堆积,导致重复消费
 channel.BasicConsume(queue: "product-create",
                                     autoAck: true, // 自动消息确认
                                     consumer: consumer);*/

 

标签:Core,false,队列,中间件,rabbitmq,消息,var,true,channel
来源: https://www.cnblogs.com/qingfenglin/p/15920076.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有