ActiveMQ Artemis:CORE管理API与hawtio控制台性能问题求助
背景
- 使用版本:ActiveMQ Artemis 2.19.1
- 实现逻辑:通过CORE Management API(
org.apache.activemq.artemis.api.core.client.*和org.apache.activemq.artemis.api.core.management.*)获取特定前缀队列的消费者数量,当消费者数为0时触发后端操作,该逻辑由20秒一次的定时任务轮询broker实现 - 当前问题:每次轮询请求都会创建临时地址,获取信息后再删除,导致Artemis/Hawtio Web控制台树状结构持续刷新,UI卡顿;日志中反复出现临时队列创建与销毁的记录
相关日志
[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) { } }
疑问与需求
选择CORE API的核心原因是它能直接处理集群中的不同节点,相比Jolokia工作量更小。现寻求以下解决方案:
- 是否可以通过连接/会话池减少临时队列的创建频率?
- 能否配置broker在消费者数为0时主动通知后端,替代当前的定时轮询方式?
- 是否支持批量删除临时队列,而非逐个销毁?
- 其他可解决Hawtio控制台卡顿问题的方案?
内容的提问来源于stack exchange,提问作者Cat

