RabbitMQ 使用场景一

Posted Garen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RabbitMQ 使用场景一相关的知识,希望对你有一定的参考价值。

目录

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 得到了回应就会立即删除该消息。

以上是关于RabbitMQ 使用场景一的主要内容,如果未能解决你的问题,请参考以下文章

RabbitMq应用一的补充(RabbitMQ的应用场景)

Kafka:那我走?这个新一代消息中间件,彻底爆火了!

用 iPad 来写代码,GitHub 又一代码编辑器,开源了!

用 iPad 来写代码,GitHub 又一代码编辑器,开源了!

动态SQL基础概念复习(Javaweb作业5)

Kafka:那我走?这个新一代消息中间件,彻底火了!