You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ActiveMQ Artemis:CORE管理API与hawtio控制台性能问题求助

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 18:25:33