В STOMP.js отправка сообщений реализуется через методы, которые
инкапсулируют работу с STOMP-командами протокола и позволяют
взаимодействовать с брокером сообщений (RabbitMQ, ActiveMQ, Apollo,
SockJS + брокеры и др.). Основной механизм отправки базируется на
команде SEND, которая формирует сообщение, направляемое в
конкретный destination (очередь или топик).
publishВ современных версиях STOMP.js (v5+ и актуальные реализации на основе
@stomp/stompjs) основной метод отправки сообщений —
publish.
Сигнатура метода:
client.publish({
destination: string,
body: string,
headers?: object
});
destination Строка, определяющая маршрут сообщения на брокере. Это может быть:
/queue/task/topic/chatbody Строка с полезной нагрузкой сообщения. STOMP не накладывает ограничений на формат, однако чаще всего используется:
JSON.stringify)headers Дополнительные STOMP-заголовки, влияющие на обработку сообщения:
content-typeprioritypersistentПример:
client.publish({
destination: "/queue/orders",
body: JSON.stringify({ id: 123, status: "created" }),
headers: {
"content-type": "application/json"
}
});
send
(устаревшие реализации)В более старых версиях STOMP.js использовался метод
send, который сохраняется для совместимости.
Сигнатура:
client.send(destination, headers, body);
Пример:
client.send(
"/topic/messages",
{ "content-type": "text/plain" },
"Hello world"
);
Использование send в новых проектах считается
нежелательным, поскольку он не соответствует современному API подходу с
объектной конфигурацией.
STOMP.js не ограничивает формат тела, однако практическое применение требует стандартизации.
Самый простой вариант:
client.publish({
destination: "/queue/logs",
body: "system started"
});
Используется для:
Наиболее распространённый формат:
client.publish({
destination: "/topic/user.events",
body: JSON.stringify({
userId: 42,
action: "login",
timestamp: Date.now()
}),
headers: {
"content-type": "application/json"
}
});
Особенности:
parseНекоторые реализации STOMP позволяют передавать бинарные данные, но поддержка зависит от брокера и транспорта.
const encoder = new TextEncoder();
const data = encoder.encode("binary payload");
client.publish({
destination: "/queue/binary",
binaryBody: data
});
Важно учитывать:
STOMP-заголовки позволяют управлять поведением доставки и обработки сообщений.
content-type Определяет формат тела:
headers: {
"content-type": "application/json"
}
persistent Указывает брокеру сохранять сообщение:
headers: {
persistent: "true"
}
priority Приоритет обработки сообщения:
headers: {
priority: "9"
}
Можно добавлять любые метаданные:
client.publish({
destination: "/queue/audit",
body: "update",
headers: {
"x-user-id": "42",
"x-request-id": "abc-123",
"x-source": "frontend"
}
});
Используется для:
В STOMP различают два основных типа маршрутов:
Сообщение получает один потребитель:
client.publish({
destination: "/queue/tasks",
body: JSON.stringify({ task: "resize-image" })
});
Характеристики:
Сообщение получают все подписчики:
client.publish({
destination: "/topic/notifications",
body: "new update available"
});
Характеристики:
STOMP не предоставляет встроенных callback-ответов на
publish, однако можно реализовать корреляцию сообщений.
const correlationId = crypto.randomUUID();
client.publish({
destination: "/queue/requests",
body: JSON.stringify({ action: "process" }),
headers: {
"correlation-id": correlationId,
"reply-to": "/queue/responses"
}
});
Используется вместе с подпиской на ответный канал.
STOMP.js не управляет таймаутами отправки напрямую, но их можно реализовать на уровне приложения.
Пример логики:
function publishWithTimeout(client, message, timeout = 5000) {
const id = crypto.randomUUID();
return new Promise((resolve, reject) => {
const timer = setTimeout(() => {
reject(new Error("Timeout sending message"));
}, timeout);
client.publish({
destination: "/queue/tasks",
body: JSON.stringify(message),
headers: {
"message-id": id
}
});
resolve({ id });
clearTimeout(timer);
});
}
STOMP.js не предоставляет batch API, но массовая отправка реализуется через цикл.
const messages = [
{ id: 1 },
{ id: 2 },
{ id: 3 }
];
messages.forEach(msg => {
client.publish({
destination: "/queue/batch",
body: JSON.stringify(msg)
});
});
Оптимизация:
Если соединение с брокером отсутствует:
Типичная защита:
if (client.connected) {
client.publish({
destination: "/queue/secure",
body: "data"
});
}
Более устойчивый вариант — буферизация:
const queue = [];
function safePublish(msg) {
if (!client.connected) {
queue.push(msg);
return;
}
client.publish(msg);
}
Некоторые брокеры поддерживают STOMP-транзакции.
const tx = client.begin();
client.publish({
destination: "/queue/tx",
body: "part 1",
transaction: tx.id
});
client.publish({
destination: "/queue/tx",
body: "part 2",
transaction: tx.id
});
tx.commit();
Возможные операции:
begin()commit()abort()Транзакции обеспечивают атомарность отправки сообщений в рамках брокера.
Перед отправкой важно учитывать:
Рекомендованный подход:
body: JSON.stringify(payload)
Ошибки частого типа:
content-typeАрхитектурно STOMP.js следует рассматривать как тонкий транспортный слой, а не как систему гарантированной доставки.