我正在尝试通过 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.1
IP 地址的计算机上的接收器代码如下所示:
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
)。另外,我的测试用户拥有完全权限。这里可能有什么问题?谢谢。
好的,我发现 的默认值是BasicConsume
,exclusive
因此在声明您的消费者时重要的是要让它如此false
(第三个布尔参数):
std::string consumer = connection->BasicConsume("rabbit", "", true, false, false);
^^^^^
Run Code Online (Sandbox Code Playgroud)
有趣的是,我在官方文档中没有找到任何与此相关的句子。
归档时间: |
|
查看次数: |
3241 次 |
最近记录: |