我正在创建一个重新连接到 RabbitMQ(使用 amqplib)的方法,使用递归并返回一个传递连接对象的 Promise。这是我到目前为止所拥有的:
function connectServiceBus() {
return new Promise(function (resolve, reject) {
amqp.connect(process.env.RMQ_CONN + "?heartbeat=60", function(err, conn) {
if (err) {
console.error("[AMQP]", err.message);
//restarts in 1 sec
return setTimeout(connectServiceBus, 1000);
}
conn.on("error", function(err) {
if (err.message !== "Connection closing") {
console.error("[AMQP] conn error", err.message);
reject(Error("[AMQP] conn error"));
}
});
conn.on("close", function() {
console.error("[AMQP] reconnecting");
//restarts in 1 sec
return setTimeout(connectServiceBus, 1000);
});
console.log("[AMQP] ServiceBus Connected");
resolve(conn);
});
});
}
我这样称呼这个方法:
sbus.connectServiceBus().then( function(conn) {
console.log("Promise called, connection Object Returned: " + conn);
}).catch (err => {
console.error("Callback ERROR: " + err);
});
问题是,如果我运行它并且 RabbitMQ 正在运行,它就可以工作。如果 RabbitMQ 关闭,代码会重新连接 OK,但永远不会调用 Promise。
如果 RabbitMQ 已关闭,则 if (err) == TRUE 并调用 setTimeout(connectServiceBus, 1000)。由于递归调用,Promise 永远不会被解决,但不知道如何修复它。
我试过更换
return setTimeout(connectServiceBus, 1000);
和
return resolve(connectServiceBus);
但这也不起作用。
谁能解释我如何解决这个问题,或提供任何见解?