• RabbitMQ四:生产者--队列--消费者


    AMQP协议的梳理和名词解析

     建议先把上篇AMQP协议先看一遍,理解一下,由于用XMind绘图,电脑屏幕比较小,不能截取全部,如果想要全图和源代码,请下面留言.......

    可以点击图片,打开到新的页面查看,文字会清晰一点。。。。。

    实例一:生产者-队列-消费者

      P(Producer):生产者,意味着发送;

      Queue:队列,本质上是一个无限的缓冲区,可以储存尽可能多的信息;

      C(Consumer):消费者,等待并接收消息。

    代码

    简述:三部分,创建连接对象的公共帮助类库,一个发布者,一个消费者

     

     MQConnnection代码单独封装一个类库:::

     public class HelpConnection
        {
            private static IConnection Connection;
            public static IConnection GetConnection()
            {
    
                if (Connection == null)
                {
                    //创建连接工厂
                    var factory = new ConnectionFactory()
                    {
                        //计算机名称,账号,密码,
                        HostName = "localhost",
                        UserName = "zhangguangpo",
                        Password = "guangpo1992",
                        RequestedHeartbeat = 60,
                        AutomaticRecoveryEnabled = true   //要启用自动连接恢复
                    };
                    //创建连接
                    Connection = factory.CreateConnection();
                    return Connection;
                }
                return Connection;
            }
        }
    

     发布者:::

            /// <summary>
            /// 案例一::: 生产者--队列--消费者
            /// </summary>
            /// <param name="args"></param>
            static void Main(string[] args)
            {
                //创建一个渠道,会话
                using (var channel = HelpConnection.GetConnection().CreateModel())
                {
                    //参数:队列名称,是否持久,是否独家,自动删除,参数
                    //QueueDeclare(string queue,durable true,exclusive false,autoDelete false, IDictionary<string, object> arguments);
                    //声明一个队列
                    channel.QueueDeclare("hello", true, false, false, null);
                    string message = "Hello World 1";
                    var body = Encoding.UTF8.GetBytes(message);
                    channel.BasicPublish("", "hello", null, body);
                    Console.WriteLine("发布成功!!!");
                    Console.ReadKey();
                }
            }

    消费者:::

    (1)获取个人消息(“拉API”)   要检索单个消息,请使用IModel.BasicGet。

    static void Main(string[] args)
            {
                using (var channel = HelpConnection.GetConnection().CreateModel())
                {
               
                    //参数:队列名称,是否持久,是否独家,自动删除,参数
                    //QueueDeclare(string queue,durable true,exclusive false,autoDelete false, IDictionary<string, object> arguments);
                    //在消费者的类里面为什么会再次声明队列(channel.QueueDeclare())呢?-- 因为接收方可能会在发送方启动前启动,这是出于保险起见。
                    channel.QueueDeclare("hello", true, false, false, null);
    
                    #region 获取个人消息(“拉API”)
                    //要检索单个消息,请使用IModel.BasicGet。返回的值是BasicGetResult的实例,可以从中提取头信息(属性)和消息体:
                    //noAck  可理解 是个消息标记,True:消息读取自动排除,下次不会读取到;false 消息没有排除,一直存在,
                    var result = channel.BasicGet("hello", True);
                    if (result == null)
                    {
                        Console.WriteLine("暂时没有消息");
                    }
                    else
                    {
                        var msg = Encoding.UTF8.GetString(result.Body);
                        Console.WriteLine(msg);
                    }
                    //确认收到消息 
                    // channel.BasicAck(result.DeliveryTag, false);
                    #endregion
                    Console.ReadKey();
    
                }
            }

     

    (2)通过订阅检索邮件(“推送API”)

     static void Main(string[] args)
            {
                using (var channel = HelpConnection.GetConnection().CreateModel())
                {
                    #region 通过订阅检索邮件(“推送API”)
                    //创建基于该队列的消费者,绑定事件
                    //我们即将告诉服务器将队列中的消息传递给我们。由于它将异步地推送我们的邮件,所以我们提供一个回调。
                    //那就是EventingBasicConsumer.Received事件处理程序。
                    var consumer = new EventingBasicConsumer(channel);
                    string msg = "";
                    consumer.Received += (model, e) =>
                    {
                        var body = e.Body; //消息主体
                        msg = Encoding.UTF8.GetString(e.Body);
                        Console.WriteLine("显示消息:" + msg);
                    };
                    //启动消费者  必须调用  IModel.BasicAck来确认您已成功接收并处理该消息:
                    channel.BasicConsume(queue: "hello",    //队列名
                                         noAck: true,   //false:手动应答;true:自动应答
                                         consumer: consumer);
                    #endregion
                    Console.ReadKey();
                }
            }

    显示效果:一样一样的

     

    • 博主是利用读书、参考、引用、抄袭、复制和粘贴等多种方式打造成自己的纯镀 24k 文章,请原谅博主成为一个无耻的文档搬运工!
    • 小弟刚迈入博客编写,文中如有不对,欢迎用板砖扶正,希望给你有所帮助。
  • 相关阅读:
    @Controller @RestController
    HOMEWORD2
    cudnn、cuda
    jupyter使用
    python学习——os模块
    python学习——导入模块、__name__
    python学习——文件
    python学习——函数、内置函数
    python学习——for循环的应用
    python学习——字典、集合、数据类型总结
  • 原文地址:https://www.cnblogs.com/lrzr/p/7286309.html
Copyright © 2020-2023  润新知