zoukankan      html  css  js  c++  java
  • dotnet core use RabbitMQ

    安装RabbitMQ

    自从使用了Docker之后,发现Docker真的是比虚拟机好用啊, 因此我这里在Docker里面创建一个RabbitMQ容器.

    这里注意获取镜像的时候要获取management版本的,不要获取last版本的,management版本的才带有管理界面.

    # 拉取镜像
    docker pull rabbitmq:management
    # 运行镜像
    docker run -d -p 5672:5672 -p 15672:15672 --name rabbitmq rabbitmq:management
    

    此时你在本机访问http://localhost:15672/即可访问后台管理界面, 这里的默认用户名和密码都是guest.

    创建项目

    使用VS创建一个名为RabbitMQ的控制台项目, 项目源码在Gitee.

    然后就是使用Nuget安装RabbitMQ.Client.

    生产者代码

            static void Producter(ConnectionFactory factory)
            {
                //创建连接
                using (IConnection conn = factory.CreateConnection())
                {
                    Console.WriteLine("
    RabbitMQ Connection Succeed!");
                    //创建通道
                    using (IModel channel = conn.CreateModel())
                    {
                        //声明一个队列
                        channel.QueueDeclare("firstChannel", false, false, false, null);
    
                        Console.WriteLine("
    Please Enter Message or q to exit");
    
                        string input;
                        do
                        {
                            input = Console.ReadLine();
                            var sendBytes = Encoding.UTF8.GetBytes(input);
                            //发布消息
                            channel.BasicPublish("", "firstChannel", null, sendBytes);
    
                        } while (input.Trim().ToLower() != "q");
                    }
                }
            }
    

    消费者代码

            static void Consumer(ConnectionFactory factory)
            {
                //创建连接
                using (IConnection conn = factory.CreateConnection())
                {
                    Console.WriteLine("
    RabbitMQ Connection Succeed!");
                    //创建通道
                    using (IModel channel = conn.CreateModel())
                    {
                        //事件基本消费者
                        EventingBasicConsumer consumer = new EventingBasicConsumer(channel);
                        //接收到消息事件
                        consumer.Received += (ch, ea) =>
                        {
                            var message = Encoding.UTF8.GetString(ea.Body);
                            Console.WriteLine($"Got Message: {message}");
                            //确认该消息已被消费
                            channel.BasicAck(ea.DeliveryTag, false);
                        };
                        //启动消费者 设置为手动应答消息
                        channel.BasicConsume("firstChannel", false, consumer);
                        Console.WriteLine("Consumer Started");
                        Console.ReadKey();
                    }
                }
            }
    

    启动函数

            static void Main(string[] args)
            {
                //创建连接工厂
                ConnectionFactory factory = new ConnectionFactory
                {
                    UserName = "guest",//用户名
                    Password = "guest",//密码
                    HostName = "localhost"//rabbitmq ip
                };
                if (args.Length > 0 && args[0] == "p") Producter(factory);
                else Consumer(factory);
                //Console.WriteLine("Hello World!");
            }
    

    启动的时候加一个参数p则是启动生产者, 否则启动的就是消费者, 启动多个实例之后可以发现, 是可以事实订阅到消息的.

    总结

    我这这边可以同时启动多生产者或者消费者, 每个生产者生产的消息只会被消费一次.

    AMQP协议中的核心思想就是生产者和消费者隔离,生产者从不直接将消息发送给队列。生产者通常不知道是否一个消息会被发送到队列中,只是将消息发送到一个交换机。先由Exchange来接收,然后Exchange按照特定的策略转发到Queue进行存储。同理,消费者也是如此。Exchange 就类似于一个交换机,转发各个消息分发到相应的队列中。

    更多具体用法以及分发模型请参考这篇文章:https://www.cnblogs.com/stulzq/p/7551819.html

  • 相关阅读:
    [BestCoder Round #3] hdu 4907 Task schedule (模拟简单题)
    .NET中的PublicKeyToken以及强命名问题
    bug统计分析续(一)基于SQL的Bug统计方法
    iOS项目开发实战——通过Http Get方式与server通信
    TCP与UDP的区别(转)
    Telit GPRS模块测试报告
    GPRS优点介绍及GPRS上网相关知识(转)
    MC34063中文资料及应用实例(转)
    MC34063+MOSFET扩流 12V-5V 折腾出了高效率电路(转)
    Bluez SPP实现代码分析(转)
  • 原文地址:https://www.cnblogs.com/jerryqi/p/11793083.html
Copyright © 2011-2022 走看看