Работа со STOMP.js начинается с создания экземпляра клиента, который
управляет жизненным циклом соединения, обменом фреймами и подписками на
каналы сообщений. В современной экосистеме чаще используется пакет
@stomp/stompjs, предоставляющий класс Client с
единым API для WebSocket и SockJS.
Для установки используется npm-пакет:
npm install @stomp/stompjs
Если требуется поддержка SockJS (например, для обхода ограничений WebSocket), дополнительно устанавливается:
npm install sockjs-client
Импорт в коде:
import { Client } from '@stomp/stompjs';
import SockJS from 'sockjs-client';
Основная точка входа — объект Client. Он инкапсулирует
подключение, отправку сообщений, подписки и обработку событий.
const client = new Client({
brokerURL: 'ws://localhost:8080/ws'
});
Параметр brokerURL используется при прямом
WebSocket-соединении. В этом режиме STOMP-клиент подключается напрямую к
серверу брокера.
Когда требуется использовать SockJS или кастомную инициализацию
WebSocket, применяется webSocketFactory.
const client = new Client({
webSocketFactory: () => new SockJS('http://localhost:8080/ws')
});
Этот подход позволяет подключаться к серверам, которые не поддерживают нативный WebSocket, но предоставляют HTTP-fallback.
Клиент STOMP.js поддерживает широкий набор параметров, влияющих на поведение соединения.
const client = new Client({
brokerURL: 'ws://localhost:8080/ws',
connectHeaders: {
login: 'user',
passcode: 'password'
},
debug: (str) => {
console.log(str);
},
reconnectDelay: 5000,
heartbeatIncoming: 4000,
heartbeatOutgoing: 4000
});
connectHeaders Передаются в момент CONNECT-фрейма. Используются для авторизации, передачи токенов или метаданных.
debug Функция логирования внутренних событий STOMP-клиента. Позволяет отслеживать фреймы CONNECT, SUBSCRIBE, SEND и DISCONNECT.
reconnectDelay Время в миллисекундах перед
автоматической повторной попыткой подключения при разрыве соединения.
Значение 0 отключает реконнект.
heartbeatIncoming / heartbeatOutgoing Механизм контроля живости соединения.
heartbeatOutgoing — интервал отправки
heartbeat-клиентомheartbeatIncoming — ожидаемый интервал heartbeat от
сервераПосле конфигурации клиент необходимо активировать.
client.activate();
Метод activate() инициирует процесс подключения и
запускает внутренний цикл управления соединением.
Для корректного завершения используется:
client.deactivate();
Этот вызов закрывает соединение, отменяет подписки и останавливает автоматический реконнект.
Клиент предоставляет callback-обработчики для ключевых этапов жизненного цикла.
const client = new Client({
brokerURL: 'ws://localhost:8080/ws',
onConnect: (frame) => {
console.log('Подключение установлено');
},
onStompError: (frame) => {
console.error('STOMP ошибка:', frame.headers['message']);
},
onWebSocketError: (event) => {
console.error('WebSocket ошибка', event);
}
});
Вызывается после успешного выполнения STOMP handshake. На этом этапе доступны подписки и отправка сообщений.
Срабатывает при ошибках протокольного уровня STOMP, например при отказе брокера или ошибке авторизации.
Обрабатывает низкоуровневые ошибки транспорта WebSocket.
Клиент STOMP.js можно рассматривать как конечный автомат с несколькими состояниями:
UNINITIALIZEDCONNECTINGCONNECTEDDISCONNECTINGDISCONNECTEDПереходы между состояниями происходят автоматически при вызовах
activate() и deactivate(), а также при сетевых
сбоях.
Механизм реконнекта встроен в Client и активируется при
ненулевом reconnectDelay.
reconnectDelay: 3000
При разрыве соединения клиент:
Подписки при этом обычно нужно восстанавливать вручную, если используется кастомная логика хранения.
import { Client } from '@stomp/stompjs';
import SockJS from 'sockjs-client';
const client = new Client({
webSocketFactory: () => new SockJS('http://localhost:8080/ws'),
connectHeaders: {
Authorization: 'Bearer token'
},
debug: (msg) => console.log(msg),
reconnectDelay: 5000,
heartbeatIncoming: 10000,
heartbeatOutgoing: 10000,
onConnect: () => {
console.log('STOMP подключён');
},
onStompError: (frame) => {
console.error('Ошибка STOMP:', frame.body);
}
});
client.activate();
В браузерной среде STOMP.js работает поверх WebSocket API, поэтому:
reconnectDelayПараметры клиента могут быть изменены до вызова
activate(). После активации изменение конфигурации не
гарантирует применения без пересоздания экземпляра.
client.reconnectDelay = 10000;
client.activate();
Корректная схема создания клиента обычно включает проверку состояния:
if (!client.active) {
client.activate();
}
Это предотвращает повторные подключения и дублирование соединений.
STOMP.js допускает создание нескольких независимых клиентов, каждый из которых может работать с разными брокерами или пространствами сообщений.
const chatClient = new Client({ brokerURL: 'ws://localhost:8080/chat' });
const notifClient = new Client({ brokerURL: 'ws://localhost:8080/notify' });
Каждый клиент управляет собственным набором подписок и состоянием соединения, не разделяя внутренние очереди сообщений.