我将消息发送到RabbitMQ队列,但是使用者没有收到任何消息。
channel.assertQueue(config.amqp.queue
显示
{ queue: 'tasks', messageCount: 0, consumerCount: 1 }
消费者什么也没显示。管理面板什么也不显示。如何确认消息已发送到RabbitMQ队列?我在发送const ok = await channel.assertQueue(config.amqp.queue,{耐用:真实});
我通过以下方式发送:
await channel.sendToQueue(config.asteriskAmi.queue, Buffer.from('string'));
请
请不要犹豫提供任何环境详细信息,这可能有助于回答您关于SO的问题:例如使用的软件包,如何初始化使用的变量等]
至回答
在amqplib documentation中(我想这是您正在使用的软件包),有一个specific type of channel使用acknowledgement表示RabbitMQ服务器已成功接收到消息:
import * as amqp from "amqplib";
// Initialise `AMQP_OPTIONS` and `message` here, e.g.:
/* const AMQP_OPTIONS = {
frameMax: 0,
heartbeat: 0,
hostname: "localhost",
locale: "en_GB",
password: "guest",
port: 5672,
protocol: "amqp",
username: "guest",
vhost: "/",
};
const message = "Hello, world!"; */
const connection = await amqp.connect(AMQP_OPTIONS);
const confirmChannel = await connection.createConfirmChannel();
await confirmChannel.assertQueue(config.amqp.queue);
confirmChannel.sendToQueue(
config.amqp.queue, // Perhaps you wanted 'config.asteriskAmi.queue' here ?
Buffer.from(message),
{},
(err, ok) => {
if (err !== null) {
console.error(err);
// Error handling
}
else {
console.info("Message successfully acked!");
// Success handling
}
}
);
NB:您的问题还可能是您的用户在发布到config.amqp.queue
时订阅了config.asteriskAmi.queue
。
希望有帮助。如果您需要有关confirmChannel.sendToQueue
的更多详细信息,这里是documentation。
使用标准AMQP 0-9-1,确保消息不丢失的唯一方法是使用事务-使通道具有事务性,然后对每个消息或消息集进行发布,提交。在这种情况下,不必要地增加了交易量,并使吞吐量降低了250倍。为此,引入了一种确认机制。它模仿了协议中已经存在的消费者确认机制。
要启用确认,客户端将发送confirm.select方法。取决于是否设置了不等待,代理可以响应confirm.select-ok
。一旦在通道上使用了confirm.select方法,就称其处于确认模式。交易频道无法进入确认模式,一旦频道进入确认模式,就无法进行交易。
一旦通道进入确认模式,代理和客户端都会对消息进行计数(从第一个确认选择开始,计数从1开始)。然后,代理通过在同一通道上发送basic.ack
来确认处理消息时的消息。 delivery-tag
字段包含已确认消息的序列号。代理还可以在basic.ack
中设置倍数字段,以指示直到包含序号的所有消息都已处理。
可以在这里https://www.rabbitmq.com/confirms.html进行进一步阅读