0

因此,我在 JS 中使用 rhea 设计了一个基本的发布者-订阅者模型,该模型接受一个 API 请求以将数据保存在 DB 中,然后将其发布到队列中。

从那里订阅者(下面添加的代码)将其拾取并尝试将其保存在数据库中。现在我的问题是这个数据库实例在开发期间经历了很多变化,并且在插入操作期间可能会导致错误。

所以现在当订阅者尝试推送到这个数据库并导致错误时,数据会因为出队而丢失。我是 JS 的新手,所以有没有办法确保消息不会出队,除非我们确定它被正确保存而不必再次发布错误?

我的订阅者的代码:

const Receiver = require("rhea");
const config = {
    PORT: 5672,
    host: "localhost"
};
let receiveClient;
function connectReceiver() {
    const receiverConnection = Receiver.connect(config);
    const receiver = receiverConnection.open_receiver("send_message");
    receiver.on("connection_open", function () {
        console.log("Subscriber connected through AMQP");
    });
    receiver.on("error", function (err) {
        console.log("Error with Subscriber:", err);
    });
    receiver.on("message", function (element) {
        if (element.message.body === 'detach') {
            element.receiver.detach();
        }
        else if (element.message.body === 'close') {
            element.receiver.close();
        }
        else {
             //save in DB
        }
    }
    receiveClient = receiver;
    return receiveClient;
}
4

1 回答 1

0

您可以使用这样的代码来明确接受消息或将其释放回发件人:

try {
    save_in_db(event.message);
    event.delivery.accept();
} catch {
    event.delivery.release();
}

有关更多信息,请参阅交付文档

于 2020-04-13T10:52:41.507 回答