Работа с STOMP.js в браузере почти всегда опирается на стандартные инструменты отладки WebSocket-соединений, встроенные в DevTools современных браузеров. Основной поток сообщений STOMP проходит поверх WebSocket, поэтому диагностика разделяется на два уровня: транспортный (WebSocket) и протокольный (STOMP-фреймы).
Вкладка Network в DevTools позволяет отслеживать установку и работу WebSocket-соединений, через которые функционирует STOMP.
При открытии соединения STOMP.js инициирует WebSocket handshake,
который отображается как запрос с типом WS.
После установки соединения:
Ключевой момент заключается в том, что STOMP не виден напрямую как
отдельный протокол в Network — браузер показывает только
WebSocket-уровень. Все STOMP-команды (CONNECT,
SEND, SUBSCRIBE, MESSAGE,
DISCONNECT) отображаются как текстовые frames внутри
соединения.
STOMP-фрейм имеет текстовую структуру, которую удобно наблюдать в DevTools:
CONNECT, SEND,
SUBSCRIBE)Пример CONNECT-фрейма:
CONNECT
accept-version:1.2
host:localhost
heart-beat:10000,10000
Пример отправки сообщения:
SEND
destination:/app/chat
content-type:application/json
{"text":"hello"}
DevTools позволяет видеть эти данные в сыром виде, что делает возможным диагностику протокольных ошибок без дополнительного логирования в коде.
Во вкладке Messages WebSocket-соединения отображаются все события в хронологическом порядке:
Полезные особенности:
Heartbeat-фреймы часто выглядят как пустые сообщения или одиночные
символы \n. Их наличие подтверждает корректную работу
keep-alive механизма STOMP.
STOMP.js предоставляет встроенный механизм логирования через callback
debug.
Включение логов:
const client = new StompJs.Client({
brokerURL: 'ws://localhost:8080/ws',
debug: function (str) {
console.log(str);
}
});
Логи содержат:
Типичный поток логов позволяет сопоставить действия приложения с WebSocket-трафиком в Network.
При диагностике важно соотносить три уровня:
Типичный сценарий анализа:
SUBSCRIBE в кодеSUBSCRIBE frame в NetworkMESSAGEНесовпадение между уровнями обычно указывает на ошибку маршрутизации или брокера.
STOMP работает через модель подписок на destination. В
DevTools нет прямой визуализации подписок, поэтому диагностика
выполняется косвенно:
SUBSCRIBE frameMESSAGE framesdestination в сообщенииПример входящего сообщения:
MESSAGE
subscription:sub-0
destination:/topic/chat
message-id:12345
{"text":"hello"}
Если MESSAGE не приходит, но SUBSCRIBE
присутствует, проблема находится вне клиента (брокер, маршрут, ACL,
очередь).
В STOMP.js heartbeat задаётся как пара значений:
heart-beat:10000,10000
Первое значение — отправка клиентом, второе — ожидание от сервера.
В DevTools это проявляется как:
Если heartbeat не работает:
Если в Network виден CONNECT, но нет
CONNECTED, значит:
Симптом:
SEND присутствует в framesПричины:
destinationСимптом:
SUBSCRIBE отправленПричины:
В ряде случаев полезно вмешательство через console:
Пример перехвата:
const originalSend = client.publish;
client.publish = function (frame) {
console.log('SEND', frame);
return originalSend.call(this, frame);
};
Такой подход позволяет сопоставить вызовы приложения с фактическим WebSocket-трафиком.
STOMP.js может автоматически переподключаться после разрыва соединения. В DevTools это проявляется как:
CONNECTВажно отслеживать:
Отсутствие восстановления подписок часто приводит к «тихим» ошибкам без видимых исключений.
При наличии нескольких STOMP-клиентов:
Ошибка конфигурации часто выражается в том, что SEND выполняется в одном соединении, а SUBSCRIBE — в другом.
Корректный анализ STOMP в DevTools опирается на последовательность:
Любое отклонение от этой цепочки фиксируется на уровне Network как первичный источник диагностики, а STOMP.js debug-лог используется для уточнения внутренней логики клиента.