Здесь может оказаться полезной документация 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
, как это сделано в пример" stamp-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
#
изменит значение по умолчанию для каждого адреса и очереди, поэтому вы можете настроить это для своих конкретных нужд.
person
Justin Bertram
schedule
30.01.2020