【问题标题】:RabbitMQ - What does it mean to declare a queue?RabbitMQ - 声明队列是什么意思?
【发布时间】:2018-07-19 14:42:55
【问题描述】:

我是 RabbitMQ 的新手,我有一个问题。这是我在教程中经常看到的示例 sn-p。

    public static void Send(string queueName, string data)
    {
        using (IConnection connection = new ConnectionFactory().CreateConnection())
        {
            using (IModel channel = connection.CreateModel())
            {
                channel.QueueDeclare(queue: queueName,
                    durable: true,
                    exclusive: false,
                    autoDelete: false,
                    arguments: null);

                // Publish to the named queue
                channel.BasicPublish(string.Empty, queue, null, Encoding.UTF8.GetBytes(data));
            }
        }
    }

我很困惑,因为每次你想调用Send 函数时声明一个队列的概念对我来说有点奇怪。这是否意味着它每次都会创建一个新队列?

一些用于从队列接收的示例代码也有一个queueDeclare 调用。为什么需要它?

【问题讨论】:

  • 如果您想了解有关消息传递和 EAI 的更多信息,请阅读 Enterprise Integration Patterns 一书。几乎所有当代 EAI 系统都基于它

标签: c# rabbitmq


【解决方案1】:

不,如果队列不存在,它只会创建队列:

声明队列,根据需要创建。

此方法创建或检查队列。创建新队列时 客户端可以指定控制持久性的各种属性 队列及其内容,以及队列的共享级别。

声明和属性等价

在使用队列之前,必须先声明它。声明一个队列 如果它尚不存在,将导致它被创建。这 如果队列已经存在并且声明将无效 它的属性与声明中的相同。当。。。的时候 现有队列属性与声明中的不同 代码为 406 (PRECONDITION_FAILED) 的通道级异常将是 提出来。

参考1 & 2

【讨论】:

  • 这有帮助。谢谢!
  • 理论上,您应该能够声明一次通道并存储对它的引用,该引用可以被多个函数访问。我对 RabbitMQ 还不够熟悉,还不知道这是否是个好主意。
  • @BradleyUffner 是正确的 - 为每个消息创建一个新连接和通道是最糟糕的 RabbitMQ 反模式之一。它实际上是与 RabbitMQ 交互的最低效的方式。不过,这可能无关紧要,具体取决于您的消息发布率。
猜你喜欢
  • 1970-01-01
  • 2014-09-20
  • 1970-01-01
  • 2022-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多