RabbitMQ:即使队列是非独占的,ACCESS_REFUSED

E_l*_*ner 2 rabbitmq

我正在尝试通过 C++ 中的 RabbitMQ 在两台计算机之间发送和接收消息。我的发件人代码如下所示:

AmqpClient::Channel::ptr_t channel = AmqpClient::Channel::Create("192.168.1.1", 5672, "test", "test", "/");
channel->DeclareQueue("rabbit", false, true, false, false);
AmqpClient::BasicMessage::ptr_t msg = AmqpClient::BasicMessage::Create("Hello Rabbit!");
channel->BasicPublish("", "rabbit", msg);
std::cout << "[x] message sent!" << std::endl;
Run Code Online (Sandbox Code Playgroud)

我在另一台具有192.168.1.1IP 地址的计算机上的接收器代码如下所示:

AmqpClient::Channel::ptr_t connection = AmqpClient::Channel::Create("localhost", 5672, "test", "test", "/");
connection->DeclareQueue("rabbit", false, true, false, false);

std::string consumer = connection->BasicConsume("rabbit", "", true, false);
while(true)
{
    AmqpClient::Envelope::ptr_t envelope = connection->BasicConsumeMessage(consumer);
    std::cout << "received message: " << envelope->Message()->Body() << std::endl;
    std::cout << "[x] ready to receive new message..." << std::endl;
    connection->BasicAck(envelope);
}
Run Code Online (Sandbox Code Playgroud)

当接收者在发送者代码完成并终止后开始接收时,这种方法工作得很好。但是当我第一次打开接收器让它待命并发送消息时,在发送方,我收到以下错误:

terminate called after throwing an instance of 'AmqpClient::AccessRefusedException'
  what(): channel error: 403: AMQP_BASIC_CONSUME_METHOD caused: ACCESS_REFUSED - queue 'rabbit' in vhost '/' in exclusive use
Run Code Online (Sandbox Code Playgroud)

我知道当声明的队列处于独占模式时应该会引发此错误,但在这里我将其声明为非独占(中的第三个布尔参数channel->DeclareQueue)。另外,我的测试用户拥有完全权限。这里可能有什么问题?谢谢。

E_l*_*ner 6

好的,我发现 的默认值是BasicConsumeexclusive因此在声明您的消费者时重要的是要让它如此false(第三个布尔参数):

std::string consumer = connection->BasicConsume("rabbit", "", true, false, false);
                                                                           ^^^^^
Run Code Online (Sandbox Code Playgroud)

有趣的是,我在官方文档中没有找到任何与此相关的句子。