Artemis Web 控制台中的数千个管理队列

1000s of Management Queues in Artemis Web Console

我正在使用 ActiveMQ Artemis 2.17.0 的管理 API 使用以下代码获取 1 个队列的计数;

    val message = session!!.createMessage(false)
    ManagementHelper.putAttribute(message, "queue.$queueName", "messageCount")
    val requestor = ClientRequestor(session, "activemq.management")
    val reply = requestor.request(message)
    val count = (ManagementHelper.getResult(reply) as Long).toInt()

但是,此代码每 30 秒运行一次,因此大约一个小时后,它会导致创建 1000 个新的临时队列,这反过来会污染并减慢管理控制台。无论如何要删除这些队列(或者更好的是在检索消息计数时不要创建它们)? (注意:服务重启后队列会被移除)

我认为您需要在 requestor 上调用 close(),以便移除用于实现请求-回复模式的底层临时队列。

我在 ActiveMQ Artemis 测试套件中创建了一个测试,唯一能让它失败的方法是 not 在 [=12= 上调用 close() ]:

package org.apache.activemq.artemis.tests.integration;

import org.apache.activemq.artemis.api.core.*;
import org.apache.activemq.artemis.api.core.client.*;
import org.apache.activemq.artemis.api.core.management.ManagementHelper;
import org.apache.activemq.artemis.core.server.ActiveMQServer;
import org.apache.activemq.artemis.tests.util.ActiveMQTestBase;
import org.junit.Before;
import org.junit.Test;

public class SimpleTest extends ActiveMQTestBase {

   protected ActiveMQServer server;
   protected ClientSession session;
   protected ClientSessionFactory sf;
   protected ServerLocator locator;

   @Override
   @Before
   public void setUp() throws Exception {
      super.setUp();
      server = createServer(false, createDefaultInVMConfig());
      server.start();
   }

   @Test
   public void simpleTest() throws Exception {
      locator = ActiveMQClient.createServerLocatorWithoutHA(new TransportConfiguration(INVM_CONNECTOR_FACTORY));
      sf = locator.createSessionFactory();
      session = sf.createSession(false, true, true);
      session.start();
      server.createQueue(new QueueConfiguration("myQueue"));

      long start = server.getPostOffice().getAllBindings().count();
      for (int i = 0; i < 100; i++) {
         ClientMessage message = session.createMessage(false);
         ManagementHelper.putAttribute(message, "queue.myQueue", "messageCount");
         ClientRequestor requestor = new ClientRequestor(session, "activemq.management");
         requestor.request(message);
         requestor.close(); // if I remove this line the test fails
      }
      assertEquals(0, server.getPostOffice().getAllBindings().count() - start);
   }
}