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);
}
}
我正在使用 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);
}
}