目录
RabbitMQ --- Work Queues(工作队列)
RabbitMQ --- Publish/Subscribe(发布/订阅)
RabbitMQ --- Routing(路由)
安装环境
1.下载安装 Erlang 运行时环境
2.下载安装 RabbitMQ Server 应用程序
3.启动 RabbitMQ 服务(默认启动)
4.安装管理平台插件并打开远程访问权限
4.1.打开 RabbitMQ Comman Prompt
4.2.执行 rabbitmq-plugins enable rabbitmq_management
4.3.访问 http://localhost:15672 查看 RabbitMQ Server 相关信息(默认账密为guest)
4.4.新增远程访问用户
4.5.点击 Set permission 授权给新用户
4.6.停止 RabbitMQ 服务
4.7.修改 ...\rabbitmq_server-3.6.10\etc\rabbitmq.config.example 文件(新增第18行代码)
4.8.启动 RabbitMQ 服务
4.9.访问 http://IP:15672 测试是否成功
基本概念
单个消息生产者 VS 单个消息消费者
在 .NET 中使用 RabbitMQ 需要下载它的客户端程序集来获取并引用 RabbitMQ 相关的组件。
using RabbitMQ.Client; using System; using System.Text; //消息生产者控制台 namespace Producer { class Program { static void Main(string[] args) { //创建连接工厂对象 var factory = new ConnectionFactory { HostName = "10.202.228.107",//目标主机IP或名称 UserName = "Tua",//RabbitMQ服务的用户名称 Password = "Tua",//RabbitMQ服务的密码 Port = 5672//RabbitMQ服务的默认端口号是5672,可以不用显示指定端口 }; //创建连接对象 using (var connection = factory.CreateConnection()) { //创建消息信道对象 using (var channel = connection.CreateModel()) { //创建消息队列,只有在该消息队列不存在时才会创建 channel.QueueDeclare ( queue: "Tua",//消息队列名称 durable: false,//是否开启持久,true:即不会因为RabbitMQ服务崩溃重启而丢失消息队列 exclusive: false,//是否开启反外,true:即只允许在当前连接中被访问,当连接断开时会自动清除该消息队列 autoDelete: false,//是否开启自动删除,true:即当无任何消息消费者时,也就是说最后一个连接断开时会自动清除该消息队列 arguments: null//用于消息队列的其它属性(构造参数) ); string msg = "Mr.Tua"; var body = Encoding.UTF8.GetBytes(msg);//将字符串消息转换成二进制数组 //发送消息,将消息发布到消息队列中 channel.BasicPublish ( exchange: string.Empty,//消息交换机名称 routingKey: "Tua",//路由键名称,指定发送到"Tua"队列 basicProperties: null,//消息的其它属性 body: body//消息内容 ); Console.WriteLine("Producer sent message: {0}", msg); Console.ReadLine(); } } } } }
using RabbitMQ.Client; using RabbitMQ.Client.Events; using System; using System.Text; //消息消费者控制台 namespace Consumer { class Program { static void Main(string[] args) { var factory = new ConnectionFactory { //目标主机为本地 HostName = "localhost" }; using (var connection = factory.CreateConnection()) { using (var channel = connection.CreateModel()) { //创建消息队列,用于确保不受发送端和接收端先后启动顺序影响 channel.QueueDeclare ( queue: "Tua", durable: false, exclusive: false, autoDelete: false, arguments: null ); //创建消息消费者对象 var consumer = new EventingBasicConsumer(channel); //异步接收消息时的回调 consumer.Received += (sender, e) => { var body = e.Body; var msg = Encoding.UTF8.GetString(body); Console.WriteLine("Consumer received message: {0}", msg); }; //启动消息消费者 //消息消费者处理完消息任务时需要回应消息生产者,使其删除该消息 //如果消息消费者没有回应,那么消息生产者会将该消息重新发送给其它消息消费者 channel.BasicConsume ( queue: "Tua", noAck: true,//是否自动回应,false:即需要手动进行消息回应 consumer: consumer ); Console.ReadLine(); } } } } }
运行结果
启动消息生产者控制台:
启动消息消费者控制台:
在 RabbitMQ Comman Prompt 中执行 rabbitmqctl list_queues 查看消息队列:
Producer 在 RabbitMQ Server 中创建了一个名为 Tua 的消息队列并含有一条 Mr.Tua 的消息,Consumer 接收到了该消息, 而 Producer 得到了回应就会立即删除该消息。