Как убедиться, что сообщение AMQP не потеряно в случае ошибки у абонента с реей? - PullRequest
0 голосов
/ 03 апреля 2020

Итак, я разработал базовую модель c Publisher-Subscriber, использующую rhea в JS, которая принимает запрос API для сохранения данных в БД и затем публикует их в очереди.

Оттуда подписчик (код добавлен ниже) берет его и пытается сохранить в БД. Теперь моя проблема заключается в том, что этот экземпляр БД претерпевает много изменений в течение периода разработки и может привести к ошибкам во время операций вставки.

Так что теперь, когда подписчик пытается вставить sh в эту БД, и это приводит к ошибка, данные потеряны, так как они были сняты. Я абсолютный новичок в JS, поэтому есть ли способ убедиться, что сообщение не удалено из очереди, если мы не уверены, что оно сохранено правильно, без необходимости публиковать sh его снова при ошибке?

Код для моего подписчика:

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;
}

1 Ответ

0 голосов
/ 13 апреля 2020

Вы можете использовать подобный код, чтобы явно принять сообщение или отправить его обратно отправителю:

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

См. документы доставки для получения дополнительной информации.

...