问题描述
我有一个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 (将#修改为@)