Node.js 如何确认消息已发送到RabbitMQ队列?

Node.js 如何确认消息已发送到RabbitMQ队列?,node.js,rabbitmq,Node.js,Rabbitmq,我将消息发送到RabbitMQ队列,但使用者没有收到任何消息 channel.assertQueue(config.amqp.queue 显示 消费者什么也没表现出来。管理面板显示什么。 如何确认消息已发送到RabbitMQ队列? 我挡道了 const ok=wait channel.assertQueue(config.amqp.queue{ 持久的:真的 }); 我通过以下方式发送: await channel.sendToQueue(config.asteriskAmi.queue,

我将消息发送到RabbitMQ队列,但使用者没有收到任何消息

channel.assertQueue(config.amqp.queue
显示

消费者什么也没表现出来。管理面板显示什么。 如何确认消息已发送到RabbitMQ队列? 我挡道了 const ok=wait channel.assertQueue(config.amqp.queue{ 持久的:真的 });

我通过以下方式发送:

  await channel.sendToQueue(config.asteriskAmi.queue, Buffer.from('string'));

请毫不犹豫地提供任何可能有助于回答您的SO问题的环境细节:例如,您正在使用的软件包、您如何初始化正在使用的变量等


回答

在(我猜这就是您正在使用的包)中,有一个使用确认来指示RabbitMQ服务器已成功接收到消息:

import*作为“amqplib”中的amqp;
//在此处初始化'AMQP_OPTIONS'和'message',例如:
/*常量AMQP_选项={
frameMax:0,
心跳:0,
主机名:“本地主机”,
语言环境:“en_GB”,
密码:“来宾”,
港口:5672,
协议:“amqp”,
用户名:“来宾”,
vhost:“/”,
};
const message=“你好,世界!”*/
const connection=等待amqp.connect(amqp_选项);
const confirmChannel=等待连接。createConfirmChannel();
等待confirmChannel.assertQueue(config.amqp.queue);
confirmChannel.sendToQueue(
config.amqp.queue,//也许您想要在这里使用“config.asteriskAmi.queue”?
缓冲区。从(消息),
{},
(呃,好)=>{
如果(错误!==null){
控制台错误(err);
//错误处理
}
否则{
console.info(“消息已成功确认!”);
//成功处理
}
}
);
NB:您的问题还可能是您的消费者在发布到
config.asteriskAmi.queue
时订阅了
config.amqp.queue


希望能有帮助。如果您需要有关confirmChannel.sendToQueue的更多详细信息,以下是使用标准AMQP 0-9-1的。在这种情况下,事务是不必要的重量级事务,会将吞吐量减少250倍。为了纠正这种情况,引入了一种确认机制。它模仿协议中已经存在的消费者确认机制

要启用确认,客户端将发送confirm.select方法。根据是否未设置等待,代理可能会响应确认。选择确定。一旦在通道上使用confirm.select方法,则称其处于确认模式。事务性通道不能置于确认模式,一旦通道处于确认模式,就不能使其成为事务性通道

一旦通道处于确认模式,代理和客户端都会对消息进行计数(计数从第一次确认时的1开始。选择)。然后,代理在处理消息时通过在同一通道上发送
basic.ack
来确认消息。
delivery tag
字段包含确认消息的序列号。代理还可以在
basic.ack
中设置multiple字段,以指示在包含序列号的消息之前的所有消息都已被处理


可以在此处进一步阅读

这里可以找到解释得很好的示例
  await channel.sendToQueue(config.asteriskAmi.queue, Buffer.from('string'));