Тайм-аут соединения с использованием nodejs stompit при подключении к activemq artemis - PullRequest
0 голосов
/ 30 января 2020

Я устанавливаю соединение с моим брокером ActiveMQ Artemis и не вижу ошибок при вызове соединения. Через некоторое время (через несколько минут) я вижу ошибку тайм-аута подключения.

Кроме того, я не вижу создаваемой очереди (только адрес), и сообщение не отображается на консоли Artemis.

enter image description here

ActiveMQ Консоль Artemis:

enter image description here

Код:

const stompConnectOptions= {
    'host': 'localhost',
    'port': 61613,
    'connectHeaders': {
        'host': '/', 'login': 'admin', 'passcode': 'xxxx', 'heart-beat': '1000,1000'
    }
};

const stompit=require ('stompit') const subscribeHeaders= {
    'destination': 'emailEvent', 'ack': 'client-individual'
};

const sendHeaders= {
    'destination': '/queue/TestEvent', 'content-type': 'text/plain'
};

stompit.connect(stompConnectOptions, (err, client)=> {
    if (err) {
        console.log("error with stomp connection.");
        return;
    }
    console.log("stomp connected") stompClient=client;
    const frame=client.send(sendHeaders);
    frame.write('hello');
    frame.end();
    console.log('hello message sent')
});

Журналы сервера ActiveMQ:

enter image description here

2020-01-29 23:33:46,333 WARN  [org.apache.activemq.artemis.core.protocol.stomp] AMQ332069: Sent ERROR frame to STOMP client /127.0.0.1:52170: null
2020-01-29 23:33:46,334 WARN  [org.apache.activemq.artemis.core.server] AMQ222067: Connection failure has been detected: null [code=REMOTE_DISCONNECT]
2020-01-29 23:33:46,335 WARN  [org.apache.activemq.artemis.core.server] AMQ222061: Client connection failed, clearing up resources for session 21617631-4319-11ea-a1bd-24a2e1f3b27a
2020-01-29 23:33:46,337 WARN  [org.apache.activemq.artemis.core.server] AMQ222107: Cleared up resources for session 21617631-4319-11ea-a1bd-24a2e1f3b27a

Я новичок в stompit.

1 Ответ

1 голос
/ 30 января 2020

Здесь может помочь документация 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), менеджер протокола просматривает это сообщение, чтобы определить, куда его направить и, возможно, как создать адрес и / или очередь, на которую он отправляется. Диспетчер протокола использует один из следующих битов информации из кадра для определения типа маршрутизации:

  1. Значение заголовка destination-type. Допустимые значения: ANYCAST и MULTICAST (с учетом регистра).

  2. «Префикс» в заголовке 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 потребностей.

...