C# RabbitMQ使用

本文介绍了C#中使用RabbitMQ的API,详细讲解了RabbitMQ的五种队列模式,包括简单队列、工作队列、发布/订阅、路由模式和主题模式,并提供了相关设置和注意事项。适合C#开发者学习RabbitMQ使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

本文章仅为个人理解,如有错误请指正。

RabbitMQ安装、说明、常用命令:https://blog.youkuaiyun.com/kang_xuan/article/details/90718878

RabbitMQ API:

Nuget UI:查找 RabbitMQ.Client

Nuget CLI: Install-Package RabbitMQ.Client -Version 5.1.0 (查找对应版本)

RabbitMQ.Client、RabbitMQ.ServiceMode两个程序集都需要进行引用。

RabbitMQ五种队列介绍:

  • RabbitMQ相关设置
    1. 安装RabbitMQ
    2. 创建虚拟机:rabbitmqctl add_vhost /demo
    3. 创建用户:rabbitmqctl add_user kk2019jy kk2019jy
    4. 设置用户权限:rabbitmqctl set_permissions -p /demo kk2019jy .* .* .*
  • 注意事项:
    1. 建议所有队列模式先创建队列后在进行生产者发送数据操作。
    2. 建议消费者不使用using调用Dispose,手动说着注册在其他事件中进行调用对象Dispose操作,Demo中使用WinForm方式,所以FormClosing进行了资源的释放。
    3. 自动消息确认和手动消息确认,同时只能使用一种方式,如果使用手动确认消息,建议在消费者事件的最后一行代码进行确认操作。
  • 简单队列

只有一个生产者,一个消费者,生产者发送消息到交换机,消费者接收队列消息并进行确认。只需要创建队列即可,不需要对交换机和队列进行绑定设置,默认使用AMQP default交换机,会将队列的名称作为路由键与交换机进行绑定。

        //创建队列
        private void button1_Click(object sender, EventArgs e)
        {
            ConnectionFactory connectionFactory = new ConnectionFactory();
            connectionFactory.HostName = "192.168.116.2";
            connectionFactory.VirtualHost = "/demo";
            connectionFactory.UserName = "kk2019jy";
            connectionFactory.Password = "kk2019jy";
            //创建连接
            using (IConnection connectionObj = connectionFactory.CreateConnection())
            {
                //创建管道
                using (IModel modelChannel = connectionObj.CreateModel())
                {
                    //声明队列,设置队列持久化
                    modelChannel.QueueDeclare("hello", true, false, false, null);
                }
            }
        }

        //生产者
        private void button2_Click(object sender, EventArgs e)
        {
            ConnectionFactory connectionFactory = new ConnectionFactory();
            connectionFactory.HostName = "192.168.116.2";
            connectionFactory.VirtualHost = "/demo";
            connectionFactory.UserName = "kk2019jy";
            connectionFactory.Password = "kk2019jy";
            using (IConnection connectionObj = connectionFactory.CreateConnection())
            {
                //创建管道
                using (IModel modelChannel = connectionObj.CreateModel())
                {
                    byte[] buffer = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(new MessageInfo { StrValue = "123", IntValue = Num++ }));
                    //发送消息,设置路由键为hello
                    modelChannel.BasicPublish("", "hello", null, buffer);
                }
            }
        }

        //消费者
        private void button3_Click(object sender, EventArgs e)
        {
            ConnectionFactory connectionFactory = new ConnectionFactory();
            connectionFactory.HostName = "192.168.116.2";
            connectionFactory.VirtualHost = "/demo";
            connectionFactory.UserName = "kk2019jy";
            connectionFactory.Password = "kk2019jy";
            ConnectionObj = connectionFactory.CreateConnection();

            //创建管道
            ModelChannel = ConnectionObj.CreateModel();
            //创建基本消费者事件对象
            EventingBasicConsumer consumerEvent = new EventingBasicConsumer(ModelChannel);
            //注册事件
            consumerEvent.Received += ConsumerEvent_Received;
            //消费者接收消息,关闭自动消息确认
            ModelChannel.BasicConsume("hello", false, consumerEvent);
        }


        private void ConsumerEvent_Received(object sender, BasicDeliverEventArgs e)
        {
            string byteStr = Encoding.UTF8.GetString(e.Body);
            JsonConvert.DeserializeObject(byteStr);
            Console.WriteLine(byteStr);
            //手动进行消息确认
            (sender as EventingBasicConsumer).Model.BasicAck(e.DeliveryTag, false); 
        }

  

  • Work队列模式

也称工作队列模式,竞争消费者模式,一个生产者,多个消费者,一个消息只能被一个消费者接收处理,Work模式有两种设置:循环调度和公平派遣,应用场景:效率高的消费者消费消息多。可以用来进行负载均衡

        //循环调度-创建队列
        private void button5_Click(object sender, EventArgs e)
        {
            ConnectionFactory connectionFactory = new ConnectionFactory();
            connectionFactory.HostName = "192.168.116.2"
### C#使用 RabbitMQ 和 P12 证书 在 .NET 环境下,当涉及到通过 SSL/TLS 进行安全通信时,可以利用 `SslOption` 类来指定客户端认证所需的 `.p12` 文件。对于 RabbitMQ 客户端库而言,在创建连接工厂实例时可以通过设置 SslOptions 来加载并应用 p12 格式的证书。 以下是具体实现方式: #### 创建 ConnectionFactory 实例并配置 SSL 设置 ```csharp using System; using RabbitMQ.Client; var factory = new ConnectionFactory(); factory.HostName = "your.rabbitmq.server"; factory.Port = AmqpTcpEndpoint.UseDefaultPort; // 默认 AMQP 端口为 5672, 如果启用了 TLS/SSL 则应改为 5671 或者服务器实际使用的其他端口号 // 配置 SSL 参数 factory.Ssl.Enabled = true; factory.Ssl.ServerName = "your.rabbitmq.server"; // 主机名或 IP 地址 factory.Ssl.CertPath = @"path\to\apiclient_cert.p12"; // 替换为真实的路径 factory.Ssl.PassPhrase = "mch_id_value"; // 微信支付平台分配给商家的 mch_id 即作为密钥串密码[^1] // 建立连接 using (var connection = factory.CreateConnection()) { using (var channel = connection.CreateModel()) { // 继续编写发送消息或者接收消息的相关逻辑... } } ``` 需要注意的是,在某些情况下可能还需要额外处理信任根 CA 的问题;另外,确保应用程序运行账户有足够的权限访问指定位置下的 `.p12` 文件也很重要。 为了使上述代码片段能够成功执行,还需满足以下条件: - 已经正确安装了 apiclient_cert.p12 证书到系统的受信任人员存储区中。 - 开发环境中已安装适用于 Windows 的 OpenSSL 库,并将其 bin 目录添加到了系统的 PATH 变量里(这一步骤取决于具体的项目需求以及所采用的操作系统版本)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值