Apache ActiveMQ представляет собой брокер сообщений, реализующий модель обмена сообщениями между распределёнными системами. В контексте STOMP.js он выступает серверной стороной, принимающей STOMP-протокол поверх TCP или WebSocket и обеспечивающей маршрутизацию сообщений между продюсерами и потребителями.
ActiveMQ поддерживает несколько протоколов, среди которых STOMP занимает важное место благодаря своей простоте и текстовому формату кадров (frames). Это делает его удобным для интеграции с JavaScript-клиентами, работающими в браузере или Node.js через STOMP.js.
Взаимодействие строится на модели клиент–брокер:
ActiveMQ в этой модели выполняет роль центра маршрутизации, а STOMP.js — лёгкого клиента, не требующего сложных бинарных протоколов.
Для работы STOMP.js с ActiveMQ требуется включённый STOMP-коннектор.
В конфигурации ActiveMQ он задаётся через activemq.xml:
<transportConnectors>
<transportConnector name="stomp" uri="stomp://0.0.0.0:61613"/>
</transportConnectors>
Порт 61613 является стандартным для STOMP поверх
TCP.
Для WebSocket-сценариев используется дополнительная настройка:
<transportConnector name="stomp+ws" uri="ws://0.0.0.0:61614"/>
Это позволяет браузерному STOMP.js подключаться напрямую без промежуточных прокси.
Клиент STOMP.js создаёт соединение с брокером через WebSocket:
import { Client } from '@stomp/stompjs';
const client = new Client({
brokerURL: 'ws://localhost:61614',
reconnectDelay: 5000,
heartbeatIncoming: 4000,
heartbeatOutgoing: 4000
});
client.onConn ect = (frame) => {
console.log('Connected to ActiveMQ');
client.subscribe('/queue/orders', (message) => {
const body = JSON.parse(message.body);
console.log('Received:', body);
});
};
client.activate();
ActiveMQ интерпретирует адрес /queue/orders как очередь
orders.
ActiveMQ поддерживает две базовые модели доставки сообщений:
Очередь обеспечивает модель point-to-point:
/queue/nameПример подписки:
client.subscribe('/queue/taskQueue', callback);
Топик реализует pub/sub модель:
/topic/nameПример:
client.subscribe('/topic/updates', callback);
ActiveMQ автоматически разделяет маршрутизацию по префиксам
/queue и /topic.
Отправка сообщений выполняется через метод publish (или
send в старых версиях):
client.publish({
destination: '/queue/orders',
body: JSON.stringify({
id: 123,
status: 'created'
})
});
ActiveMQ помещает сообщение в очередь orders, после чего
оно становится доступным подписчикам.
STOMP протокол основан на текстовых кадрах, содержащих:
Пример SEND-кадра:
SEND
destination:/queue/orders
content-type:application/json
{"id":123,"status":"created"}
ActiveMQ парсит кадр и направляет сообщение в соответствующий destination.
ActiveMQ поддерживает durable subscriptions для топиков. Это позволяет сохранять сообщения для офлайн-подписчиков.
Настройка на стороне клиента:
client.subscribe('/topic/events', callback, {
id: 'unique-subscription-id',
persistent: 'true'
});
На стороне ActiveMQ подписка идентифицируется по
clientId и subscriptionName.
ActiveMQ поддерживает разные режимы подтверждения:
autoclientclient-individualВ STOMP.js:
client.subscribe('/queue/orders', (message) => {
const data = JSON.parse(message.body);
message.ack();
}, { ack: 'client' });
Режим client требует явного подтверждения, что позволяет
реализовать контроль доставки.
ActiveMQ поддерживает транзакционные сессии STOMP:
client.begin('tx1');
client.publish({
destination: '/queue/orders',
body: 'data'
});
client.commit('tx1');
При ошибке можно выполнить:
client.abort('tx1');
Это обеспечивает атомарность группы сообщений.
ActiveMQ и STOMP.js используют heartbeat для контроля живости соединения.
Конфигурация клиента:
heartbeatIncoming: 10000,
heartbeatOutgoing: 10000
ActiveMQ отвечает на heartbeat кадрами \n, предотвращая
разрыв соединения NAT или прокси.
ActiveMQ поддерживает message selectors на основе SQL92:
client.subscribe('/queue/orders', callback, {
selector: "priority = 'high'"
});
Со стороны ActiveMQ фильтрация происходит до доставки сообщения клиенту.
ActiveMQ различает типы доставки:
STOMP.js задаёт это через заголовки:
client.publish({
destination: '/queue/orders',
headers: {
persistent: 'true'
},
body: 'message'
});
Persistent режим важен для критичных систем, где потеря сообщений недопустима.
ActiveMQ отслеживает соединения STOMP-клиентов:
client-idПри разрыве соединения брокер может сохранить состояние durable подписок и восстановить доставку после реконнекта клиента.
ActiveMQ отправляет ERROR кадры при проблемах:
ERROR
message:Subscription failed
content-type:text/plain
Subscription not authorized
На стороне STOMP.js обработка:
client.onStompEr ror = (frame) => {
console.error(frame.headers['message']);
};
Также важны ошибки маршрутизации, переполнения очередей и недоступности destinations.
ActiveMQ может работать в нескольких режимах:
При STOMP.js нагрузке масштабирование достигается через:
STOMP остаётся единым протоколом на уровне клиента, независимо от внутренней архитектуры брокера.
STOMP.js в браузере через ActiveMQ требует:
Типичный endpoint:
ws://host:61614
При этом брокер остаётся полностью прозрачным для клиента, который оперирует только destination-адресами.