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

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

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

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();

2 ответов


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

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

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

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

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