Автоматическое повторное подключение к 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 Этот пакет не только поддерживает автоматическое повторное соединение, но оно также будет повторно подписаться на все очереди и отправить любые ожидающие сообщения.