Я использую 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) {
}
}
Есть ли возможность кэшировать подключения потребителей для временных очередей из пользовательского интерфейса, например, чтобы ActiveMQ не добавлял/удалял mbeans при каждом подключении?
Я обновил свой ответ, чтобы ответить на ваши комментарии.
Чтобы было ясно, в журнале указано, что создается и уничтожается очередь, а не адрес.
Очередь создается и уничтожается, потому что вы используете 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 не свернет дерево.
@jbertram Спасибо, Джастин, за вашу рекомендацию, это, по крайней мере, делает его лучше. В любом случае, удаление любых других временных очередей/адресов также вызывает много перезагрузки, что означает крах всего дерева. И вообще, как его потом использовать? Или это, кажется, проблема hawtio?