首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何确认消息已经发送到RabbitMQ队列?

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

Stack Overflow用户
提问于 2019-11-19 17:10:46
回答 2查看 1K关注 0票数 2

我向RabbitMQ队列发送消息,但是消费者什么也没收到。

代码语言:javascript
复制
channel.assertQueue(config.amqp.queue

显示

代码语言:javascript
复制
{ queue: 'tasks', messageCount: 0, consumerCount: 1 }

消费者什么也没表现出来。管理面板不显示任何内容。如何确认消息已经发送到RabbitMQ队列?我以const ok = await channel.assertQueue(config.amqp.queue,{channel.assertQueue: true })的方式发送;

我通过以下方式发送:

代码语言:javascript
复制
  await channel.sendToQueue(config.asteriskAmi.queue, Buffer.from('string'));
EN

回答 2

Stack Overflow用户

发布于 2019-11-19 18:14:06

请使用

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

用于回答的

amqplib documentation (我猜这就是您正在使用的包)中,有一个使用acknowledgement指示RabbitMQ服务器已成功接收到一条消息的specific type of

代码语言:javascript
复制
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

票数 1
EN

Stack Overflow用户

发布于 2019-11-20 01:34:43

使用标准AMQP0-9-1,保证消息不会丢失的唯一方法是使用事务--使通道成为事务性的,然后针对每个消息或消息集发布、提交。在这种情况下,事务是不必要的重量级事务,并将吞吐量降低250倍。为了纠正这一点,引入了确认机制。它模仿了协议中已经存在的消费者确认机制。

要启用确认,客户端需要发送confirm.select方法。根据是否设置了no-wait,代理可能会使用confirm.select-ok进行响应。一旦在通道上使用了confirm.select方法,它就被称为处于确认模式。事务性通道不能进入确认模式,一旦通道处于确认模式,它就不能成为事务性通道。

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

更多的阅读可以在这里完成https://www.rabbitmq.com/confirms.html

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58930292

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档