Rabbitmq直接交换具有耐用性

问题描述

我有一个nodejs应用程序,该应用程序连接到Rabbitmq服务器以向移动应用程序发送通知。 我创建了带有耐用性:true属性的直接交换,并使用持久性:true属性发布了消息,但消息未存储。例如,如果我发布了具有routeKey“ hello”的消息,并且在发布时,没有任何绑定了“ hello”的队列,则exchange会忽略此消息。我想存储此消息并在“ hello”绑定建立时发送到队列。我怎样才能实现这个目标? 在这里,我的代码在下面。任何帮助,我都感激。

const { clients } = require("./ws");
const { env } = require("../config/env");
const amqp = require("amqplib/callback_api");
const rabbitmq = {};
const exchange = "NOTIFICATION3";

amqp.connect(env.rabbitmqUrl,(err,conn) => {
  if (err) {
    console.log(`amqp.connect Error ${err}`);
    return;
  }
  conn.createChannel((err,ch) => {
    if (err) {
      console.log(`conn.createChannel Error ${err}`);
      return;
    }
    ch.assertExchange(exchange,"direct",{ durable: true });
    ch.assertQueue("",{ exclusive: true },q) => {
      if (err) {
        console.log(`ch.assertQueue Error ${err}`);
        return;
      }
      ch.prefetch(1);
      ch.consume(
        q.queue,(msg) => {
          console.log(
            ` [x] ${msg.fields.routingKey}: ${msg.content.toString()}`
          );
          ch.ack(msg);
        },{ noAck: false }
      );

      rabbitmq.bind = ((ch,q,exchange) => (userId) => {
        ch.bindQueue(q.queue,exchange,userId);
      })(ch,exchange);

      rabbitmq.unbind = ((ch,exchange) => (userId) => {
        ch.unbindQueue(q.queue,exchange);
      rabbitmq.bind("1");
      rabbitmq.bind("2");
      setTimeout(() => {
        rabbitmq.bind("3");
      },2000);
    });
    rabbitmq.publish = ((ch,exchange) => (userId,msg) => {
      ch.publish(exchange,userId,Buffer.from(msg),{
        persistent: true,});
      console.log(` [x] Sent ${msg} to ${exchange}: ${userId}`);
    })(ch,exchange);
    setTimeout(() => {
      rabbitmq.publish("1","tarik carli");
      rabbitmq.publish("2","tarik carli");
      rabbitmq.publish("3","tarik carli");
    },1000);
  });
});
module.exports = rabbitmq;

和我的console.log结果如下。


    Server is listening port 4000.
    [x] Sent tarik carli to NOTIFICATION3: 1
    [x] Sent tarik carli to NOTIFICATION3: 2
    [x] Sent tarik carli to NOTIFICATION3: 3
    [x] 1: tarik carli
    [x] 2: tarik carli

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)