• 【小5聊】C#控制台使用RabbitMQ进行简单的消息生产和消费


    消息队列MessageQueue,简称MQ

    处理非主业务功能,同时也能在高并发下异步处理的功能,使用MQ就是最佳选择

    虽然开发了很多年,现在回想起来,还真没有自己主导框架在实际项目中运用MQ,都是现有框架往里面加功能。

    所以此处,也只是在简单的RabbitMQ安装和使用

    1、RabbitMQ概念

    1)实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)

    2)RabbitMQ服务器是用Erlang语言编写

    3)RabbitMQ,支持大多操作系统和编程语言

    4)exchange,交换器,TA接收生产者消息,TA把消息推送到队列中

    5)4种消息类型,direct、topic、headers、fanout

    2、RabbitMQ官网下载

    看到这些官网都是英文,有些感慨,为啥我们就没能开发这么流行的技术呢

    1)点击跳转页面

    2)点击-Chocolatey or Installer (recommended=推荐)

    3)点击,rabbitmq-server-3.10.6

    跳转页面,页面滚动到中间即可看到如下内容,目前版本是-3.10.6

     

    3、安装Erl开发语言环境软件

    1)如果没有先安装Erlang,那么会出现以下提示

     

     2)跳转到页面

    3)根据自己系统下面

    不过一般windows都是64位,需要点开那个箭头,otp_win64_25.0.3

    4)之后就是下一步

    默认安装目录:C:\Program Files\Erlang OTP

    5)查看环境变量

    安装的时候,已经自动添加了ERLANG_HOME变量对应的安装路径

    %ERLANG_HOME%\bin

    6)cmd命令查看erlang版本

     

    4、安装RabbitMQ

    1)运行rabbitmq-server-3.10.6.exe

     2)下一步,无需其他操作

    默认安装路径:C:\Program Files\RabbitMQ Server

    3)找到RabbitMQ的输出目录

    C:\Users\自己操作系统名称\AppData\Roaming\RabbitMQ
    •  默认没有配置文件,需要自己添加,文件
    1. [ {
    2. rabbit,
    3. [ {
    4. tcp_listeners,
    5. [ {"0.0.0.0" ,5672}]
    6. }]
    7. },{
    8. rabbitmq_management,
    9. [ {
    10. listener,
    11. [
    12. {port , 15672},
    13. {ip , "0.0.0.0"},
    14. {ssl,false}
    15. ]
    16. }]
    17. }].
    • 文件命名如下

    rabbitmq.config

    4)cmd命令重新启动RabbitMQ服务

    cmd定位到安装目录,如下

    C:\Program Files\RabbitMQ Server\rabbitmq_server-3.10.6\sbin

    分别执行如下4条语句:服务》停止》移除》安装》开启

    1. rabbitmq-service stop
    2. rabbitmq-service remove
    3. rabbitmq-service install
    4. rabbitmq-service start

    • 同样可以在《服务》里找到它并重启

     

    5)访问RabbitMQ的Web端管理工具

    默认的账号密码就是guest

     5、设置账号和权限

    1)登录进入界面,打开Admin和Users,操作如下

    可能不同版本稍微有点区别,记得一定要设置用户角色分类,就是Set区域,可以选择Admin管理员

    2)用户角色分类

    编号角色名称备注
    1Admin/Administrator-超级管理员可登录管理控制台,拥有所有权限,可查看用户所有信息,以及操作用户和策略(policy),
    2Monitoring-监控者可登录,可查看节点信息,比如进程数、内存‘磁盘使用情况        
    3Policymaker-策略制定者可登录,对policy策略进行管理,但不可查看节点西悉尼
    4Management-普通管理者仅登录,无查看策略和节点权限
    5Impersonator-模拟者
    6None-其他不可登录,普通得生产者和消费者

     3)添加没有角色得用户进行MQ连接

    • 添加none角色用户

    •  出现如下提示

    • 点击进入user_none界面
    1. This user does not have permission to access any virtual hosts.
    2. Use "Set Permission" below to grant permission to access virtual hosts.
    3. 此用户没有访问任何虚拟主机的权限。
    4. 使用下面的“设置权限”授予访问虚拟主机的权限。
    • 设置权限

     点击Set permission按钮即可

    •  再次访问

    • 消息队列信息

    6、消息生产端控制台代码

    生产发布消息到RabbitMQ消息中心,等待订阅者消费消息

    • 发送了3条消息到队列

    •  代码
    1. /*
    2. NuGet
    3. 1、RabbitMQ.Client - 6.0.0
    4. */
    5. using RabbitMQ.Client;
    6. using System;
    7. using System.Text;
    8. namespace rabbitMQ.Client.producer
    9. {
    10. class Program
    11. {
    12. ///
    13. /// 消息生产者(消费用户)
    14. ///
    15. ///
    16. static void Main(string[] args)
    17. {
    18. //创建连接工厂
    19. ConnectionFactory factory = new ConnectionFactory
    20. {
    21. UserName = "user_none",
    22. Password = "123123",
    23. HostName = "192.168.1.102",
    24. Port = 5672
    25. };
    26. //创建连接
    27. var connection = factory.CreateConnection();
    28. //创建通道
    29. var channel = connection.CreateModel();
    30. //声明一个队列
    31. channel.QueueDeclare("My.First.Queue2", false, false, false, null);
    32. string msg;
    33. do
    34. {
    35. msg = Console.ReadLine();
    36. Console.WriteLine($"发送的消息:{msg}");
    37. var sendbytes = Encoding.UTF8.GetBytes(msg);
    38. channel.BasicPublish("", "My.First.Queue2", null, sendbytes); //发布
    39. }
    40. while (!msg.Trim().ToLower().Equals("exit"));
    41. channel.Close();
    42. connection.Close();
    43. }
    44. }
    45. }

    7、消息消费端控制台代码

    消息订阅者,从消息中心获取未消费得消息

    • 消费完成后,队列里得消息就变为0 了,表示已经确认消费完成了 

    • 代码如下

     

    1. using RabbitMQ.Client;
    2. using RabbitMQ.Client.Events;
    3. using System;
    4. using System.Text;
    5. namespace rabbitMQ.Client.consumer
    6. {
    7. class Program
    8. {
    9. ///
    10. /// 消息消费者(后台处理方法)
    11. ///
    12. ///
    13. static void Main(string[] args)
    14. {
    15. //创建连接工厂
    16. ConnectionFactory factory = new ConnectionFactory
    17. {
    18. UserName = "user_none",
    19. Password = "123123",
    20. HostName = "192.168.1.102",
    21. Port = 5672
    22. };
    23. //创建连接
    24. var connection = factory.CreateConnection();
    25. //创建通道
    26. var channel = connection.CreateModel();
    27. channel.BasicQos(prefetchSize: 0, prefetchCount: 1, global: false);
    28. //接收到的消息处理事件
    29. EventingBasicConsumer Recipient = new EventingBasicConsumer(channel);
    30. channel.BasicConsume("My.First.Queue2", false, Recipient);
    31. Recipient.Received += (ch, ea) =>
    32. {
    33. var RecipientMsg = Encoding.UTF8.GetString(ea.Body.ToArray());
    34. Console.WriteLine($"收到消息:{RecipientMsg}");
    35. //确认该消息已被处理
    36. channel.BasicAck(ea.DeliveryTag, false);
    37. Console.WriteLine($"消息已确认处理【{ea.DeliveryTag}】");
    38. };
    39. try
    40. {
    41. }
    42. catch
    43. {
    44. Console.WriteLine($"服务中心还未有队列消息!");
    45. }
    46. Console.ReadKey();
    47. channel.Dispose();
    48. connection.Close();
    49. }
    50. }
    51. }

    【遇到的情况】

    为了梳理安装过程,先后把Erl和RabbitMQ软件卸载了,但是RabbitMQ.Client依然是可以运行的,这是不是说明,开启RabbitMQ这个服务,其实已经有独立进程运行了

    1)带着这个疑问查看了任务管理器,Erl卸载了,居然还在

    2)结束上面进程后,再次运行,发现已经无法连接到目标了

     3)消费端,找不到队列会报错

    解决方法:

    1)如果是同时运行,那么可在消费端添加一个Sleep休眠,确保消费端在生产端之后运行,这样生产端就能在消费端获取队列时生成队列。

    2)先在rabbitmq的web端先手动添加队列名称(基于目前理解,有不对的地方望大家指出)

     

     

  • 相关阅读:
    qwen微调
    《计算机网络》:考研 2024/3/5 2.1.1-物理层基本概念引入
    Leetcode2760. 最长奇偶子数组
    Java题目详解——LeetCode203. 移除链表元素
    安卓USB模块分析(二)- API使用
    [datawhale202211]跨模态神经搜索实践:环境配置
    省 市 县 三级联动
    Java的进化之路走到了尽头
    Pyside6:加载.ui
    SpringBoot实现分页查询
  • 原文地址:https://blog.csdn.net/lmy_520/article/details/125877789