Здесь может помочь документация ActiveMQ Artemis STOMP .
Первое, что я рекомендую, - включить ведение журнала отладки. Документация гласит:
Входящие и исходящие кадры STOMP можно регистрировать, включив DEBUG
для org.apache.activemq.artemis.core.protocol.stomp.StompConnection
. Это может быть чрезвычайно полезно для отладки или просто мониторинга активности клиента. Наряду с самим кадром STOMP регистрируется удаленный IP-адрес клиента, а также внутренний идентификатор соединения, что позволяет сопоставлять кадры одного и того же клиента.
Вы можете включить это ведение журнала, изменив etc/logging.properties
.
Сначала , добавьте это в разделенный запятыми список loggers
в начале файла:
org.apache.activemq.artemis.core.protocol.stomp.StompConnection
Второй , добавьте новая строка с этим под комментарием ActiveMQ Artemis logger levels
:
logger.org.apache.activemq.artemis.core.protocol.stomp.StompConnection.level=DEBUG
Как только вы включили ведение журнала, это должно помочь вам понять, почему закрывается соединение. Я предполагаю, что клиент не посылает правильные сердечные кадры. В этом случае вы можете попробовать подключиться без пульса, например:
const stompConnectOptions= {
'host': 'localhost',
'port': 61613,
'connectHeaders': {
'host': '/', 'login': 'admin', 'passcode': 'xxxx', 'heart-beat': '0,0'
}
};
Документация также должна помочь объяснить, почему создается только адрес, а не очередь. В разделе «Отправка» документация гласит:
Когда клиент STOMP отправляет сообщение (используя фрейм SEND
), менеджер протокола просматривает это сообщение, чтобы определить, куда его направить и, возможно, как создать адрес и / или очередь, на которую он отправляется. Диспетчер протокола использует один из следующих битов информации из кадра для определения типа маршрутизации:
Значение заголовка destination-type
. Допустимые значения: ANYCAST
и MULTICAST
(с учетом регистра).
«Префикс» в заголовке destination
. См. дополнительную информацию о префиксах.
Если указание типа маршрутизации не предоставлено, то значение по умолчанию, определенное в соответствующих default-address-routing-type
& default-queue-routing-type
адресах, будет
Заголовок destination
отображается на адрес с тем же именем. Если в заголовке destination
используется префикс, префикс удаляется.
При отправке сообщения брокер использует тип маршрутизации MULTICAST
, что означает, что он будет автоматически создавать только адрес и не очередь Это поведение по умолчанию.
Как отмечено в документации , у вас есть 3 основных варианта , чтобы решить эту проблему ...
Один , вы можете отправьте заголовок destination-type
, например:
const sendHeaders= {
'destination': '/queue/TestEvent', 'content-type': 'text/plain', 'destination-type': 'ANYCAST'
};
Два , вы можете настроить префикс на STOMP acceptor
, как это делается в "stomp-jms" пример поставляется с брокером, например:
<acceptor name="stomp">tcp://0.0.0.0:61613?anycastPrefix=/queue/</acceptor>
Три , вы можете изменить стандартные типы маршрутизации через настройки адреса, например:
<address-setting match="#">
...
<default-address-routing-type>ANYCAST</default-address-routing-type>
<default-queue-routing-type>ANYCAST</default-queue-routing-type>
...
</address-setting>
Конечно, использование match
из #
изменит значение по умолчанию для каждый адрес и очередь, так что вы можете настроить его для своих конкретных c потребностей.