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

时间:2019-11-19 09:10:45

标签: node.js rabbitmq

我将消息发送到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'));

2 个答案:

答案 0 :(得分:0)

不要犹豫,提供任何可能有助于回答您关于SO的问题的环境详细信息:您正在使用的软件包,如何初始化正在使用的变量等。


答复

amqplib documentation(我想这是您正在使用的程序包)中,有一个specific type of channel使用确认来表示邮件已被成功接收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
    }
  }
);

注意事项:您的问题还可能是您的消费者在发布到config.amqp.queue时订阅了config.asteriskAmi.queue

希望有帮助。如果您需要有关confirmChannel.sendToQueue的更多详细信息,请查看documentation

答案 1 :(得分:0)

使用标准AMQP 0-9-1,确保消息不会丢失的唯一方法是使用事务-使通道具有事务性,然后对每个消息或一组消息进行发布,提交。在这种情况下,交易会不必要地增加重量,并使吞吐量降低250倍。为此,引入了一种确认机制。它模仿了该协议中已经存在的消费者确认机制。

要启用确认,客户端将发送confirm.select方法。取决于是否设置了不等待,代理可以响应confirm.select-ok。一旦在通道上使用了confirm.select方法,就称其处于确认模式。交易频道无法进入确认模式,一旦频道进入确认模式,就无法进行交易。

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

可以在这里https://www.rabbitmq.com/confirms.html

进行进一步的阅读