Автоматическое повторное подключение к Stomp.js в приложении Node.js

Я работаю с приложением, написанным в Node.js и Express, и я пытаюсь использовать Stomp.js client для подключения к серверу ActiveMQ.

Я могу заставить приложение легко подключиться к ActiveMQ, используя Stomp, но я не могу заставить систему автоматически подключаться к сбою соединения. Похоже, что функция сбоя вызывается только в том случае, если соединение изначально выполнено успешно, а затем прекращено, хотя если ActiveMQ уже запущен при запуске приложения Node, я вижу сообщение об ошибке, которое доказывает, что функция отказа была вызвана.

var Stomp = require('stompjs');
var stompClient = Stomp.overTCP('localhost', 61612);
var stompStatus = false;

var stompSuccessCallback = function (frame) {
    stompStatus = true;
    console.log('STOMP: Connection successful');
};

var stompFailureCallback = function (error) {
    stompStatus = false;
    console.log('STOMP: ' + error);

    setTimeout(stompConnect, 10000);
    console.log('STOMP: Reconecting in 10 seconds');
};

function stompConnect() {
    console.log('STOMP: Attempting connection');
    stompClient.connect('login', 'password', stompSuccessCallback, stompFailureCallback);

}

stompConnect();

Кто-нибудь знает, что здесь происходит?

Ответ 1

WebSocket, который хранится Stomp.client, может быть открыт только один раз. Если произошел сбой в сети, повторное соединение с одним и тем же StompClient не будет работать, поскольку веб-сокет останется закрытым.

Это может быть определенно улучшено stomp.js, но в среднем вы можете обойти это, воссоздав Stomp.client, когда обнаружен сбой. Что-то вроде:

var stompClient;

var stompFailureCallback = function (error) {
    console.log('STOMP: ' + error);
    setTimeout(stompConnect, 10000);
    console.log('STOMP: Reconecting in 10 seconds');
};

function stompConnect() {
    console.log('STOMP: Attempting connection');
    // recreate the stompClient to use a new WebSocket
    stompClient = Stomp.overTCP('localhost', 61612);
    stompClient.connect('login', 'password', stompSuccessCallback, stompFailureCallback);
}

Ответ 2

Оригинальные sompjs больше не поддерживаются. Используйте https://github.com/stomp-js/stomp-websocket В этой версии есть поддержка автоматического повторного подключения. В каждом успешном соединении обратный вызов соединения вызывается там, где вы можете делать свои подписки.

Если вы используете Angular 2, 4 или 5. Вы должны посмотреть https://github.com/stomp-js/ng2-stompjs Этот пакет не только поддерживает автоматическое повторное соединение, но оно также будет повторно подписаться на все очереди и отправить любые ожидающие сообщения.