ActiveMQ Artemis: API управления CORE и проблема с hawtio

Я использую ActiveMQ Artemis 2.19.1 с CORE Management API (org.apache.activemq.artemis.api.core.client.* и org.apache.activemq.artemis.api.core.management.*), чтобы получить количество потребителей из некоторых очередей с префиксом. Если счетчики равны нулю, значит что-то сделано в бэкэнде. Это делается запланированной задачей, которая периодически запрашивает эту информацию у брокера.

Для каждого запроса создается временный адрес, который после использования информации удаляется.

Проблема в том, что дерево веб-консоли Artemis/Hawtio постоянно обновляется, что делает пользовательский интерфейс вялым и непригодным для сопровождения. Существует также подсказка от Hawtio относительно такого поведения (см. подраздел «Дерево постоянно обновляется, что делает пользовательский интерфейс вялым»).

Насколько я знаю, API CORE может обрабатывать разные узлы кластера, что требует гораздо больше усилий, чем с Jolokia. Я думаю, что это было основной причиной его использования.

Есть ли другая возможность справиться с этим? Может быть, какой-то пул соединений/сеансов? Или брокер может связываться с серверной частью, если количество потребителей равно нулю? Или, может быть, временные очереди можно удалять пакетно, а не по очереди?

Это то, что журналы говорят снова и снова:

[org.apache.activemq.artemis.core.server.plugin.impl] AMQ841007: created queue: QueueImpl[name=activemq.management.96a1005f-b67c-40af-b9cd-811f36750c5e, postOffice=PostOfficeImpl [server=ActiveMQServerImpl::name=artemis-2.19.1], temp=true]@58d1994e

[org.apache.activemq.artemis.core.server.plugin.impl] AMQ841008: destroyed queue: QueueImpl[name=activemq.management.96a1005f-b67c-40af-b9cd-811f36750c5e, postOffice=PostOfficeImpl [server=ActiveMQServerImpl::name=artemis-2.19.1], temp=true]@58d1994e, with args address: activemq.management.96a1005f-b67c-40af-b9cd-811f36750c5e, session: ServerSessionImpl(), checkConsumerCount: true, removeConsumers: false, autoDeleteAddress: true

Для подключения я использую следующее:

private ServerLocator locator;
private ClientSessionFactory defaultFactory;

public ManagementHelper(String defaultURL) {
    this.locator = ActiveMQClient.createServerLocator(defaultURL);
    this.defaultFactory = locator.createSessionFactory();
}
@Scheduled(fixedRateString = "20000")
public void getConsumerNbos(ClientSessionFactory factory, ServerLocator locator) {
    try (ClientSession session = factory.createSession(this.username, this.password, false, true, true,
            locator.isPreAcknowledge(), locator.getAckBatchSize());
            ClientRequestor requestor = new ClientRequestor(session, "activemq.management");) {

        ClientMessage message = session.createMessage(false);
        ManagementHelper.putOperationInvocation(message, ResourceNames.BROKER, listAllConsumersAsJSON);
        session.start();

        ClientMessage replyConsumer = requestor.request(message);
        String resultJSON = (String) ManagementHelper.getResult(replyConsumer, String.class);

        ClientMessage message2 = session.createMessage(false);
        ManagementHelper.putOperationInvocation(message2, ResourceNames.BROKER, MANAGEMENT_OPERATION_QUEUES);

        ClientMessage replyQueueNames = requestor.request(message2);
        Object[] objQueueNames = (Object[]) ManagementHelper.getResult(replyQueueNames);
    } catch (Exception e) {

    }
}

@jbertram Спасибо, Джастин, за вашу рекомендацию, это, по крайней мере, делает его лучше. В любом случае, удаление любых других временных очередей/адресов также вызывает много перезагрузки, что означает крах всего дерева. И вообще, как его потом использовать? Или это, кажется, проблема hawtio?

Cat 13.09.2022 14:39

Есть ли возможность кэшировать подключения потребителей для временных очередей из пользовательского интерфейса, например, чтобы ActiveMQ не добавлял/удалял mbeans при каждом подключении?

Cat 13.09.2022 15:12

Я обновил свой ответ, чтобы ответить на ваши комментарии.

Justin Bertram 13.09.2022 16:56
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
0
3
96
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы было ясно, в журнале указано, что создается и уничтожается очередь, а не адрес.

Очередь создается и уничтожается, потому что вы используете org.apache.activemq.artemis.api.core.client.ClientRequestor. Когда вы создаете ClientRequestor, он автоматически создает временную очередь с именем UUID по указанному вами адресу (например, activemq.management в вашем случае). Затем, когда вы закрываете ClientRequestor, эта очередь удаляется.

Я бы порекомендовал просто кэшировать ваши ClientSession и ClientRequestor так же, как вы это делаете для своих ServerLocator и ClientSessionFactory, например:

private ServerLocator locator;
private ClientSessionFactory defaultFactory;
private ClientSession session;
private ClientRequestor requestor;

public ManagementHelper(String defaultURL) {
    this.locator = ActiveMQClient.createServerLocator(defaultURL);
    this.defaultFactory = locator.createSessionFactory();
    this.session = factory.createSession(this.username, this.password, false, true, true, locator.isPreAcknowledge(), locator.getAckBatchSize());
    this.requestor = new ClientRequestor(session, "activemq.management");
}
@Scheduled(fixedRateString = "20000")
public void getConsumerNbos(ClientSessionFactory factory, ServerLocator locator) {
    ClientMessage message = session.createMessage(false);
    ManagementHelper.putOperationInvocation(message, ResourceNames.BROKER, listAllConsumersAsJSON);
    session.start();

    ClientMessage replyConsumer = requestor.request(message);
    String resultJSON = (String) ManagementHelper.getResult(replyConsumer, String.class);

    ClientMessage message2 = session.createMessage(false);
    ManagementHelper.putOperationInvocation(message2, ResourceNames.BROKER, MANAGEMENT_OPERATION_QUEUES);

    ClientMessage replyQueueNames = requestor.request(message2);
    Object[] objQueueNames = (Object[]) ManagementHelper.getResult(replyQueueNames);
}

Если у вас по-прежнему возникают проблемы с обновлением Hawtio, вы также можете отключить его, перейдя на страницу «Настройки» (в правом верхнем углу веб-консоли), щелкнув вкладку «Jolokia» и изменив «Частота обновления» на "Выключенный". Вот скриншот страницы:

Думаю, теперь я смог воспроизвести проблему: по-видимому, это зависит от того, на каком уровне дерева вы нажали, что означает, что оно помечено розовым. Если вы расширите уровень "адреса" только левым углом (не словом) - он не будет помечен розовым, он просто расширит дерево. Розовая метка остается на уровне 0, если она была там раньше. Если затем загружается новый mbean, дерево сворачивается, показывая только уровни 0 и 1. Вместо этого: если вы развернете «адреса» и также пометите его розовым цветом, созданный или удаленный mbean не свернет дерево.

Cat 14.09.2022 09:58

Другие вопросы по теме

Похожие вопросы