This commit is contained in:
Justin Bertram 2022-03-30 11:57:28 -05:00
commit c3e6ce075c
No known key found for this signature in database
GPG Key ID: F41830B875BB8633
4 changed files with 131 additions and 31 deletions

View File

@ -24,6 +24,8 @@ import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.artemis.api.core.QueueConfiguration;
import org.apache.activemq.artemis.json.JsonArray;
import org.apache.activemq.artemis.json.JsonObject;
import javax.xml.parsers.DocumentBuilder;
@ -1737,6 +1739,33 @@ public class ArtemisTest extends CliTestBase {
}
@Test
public void testHugeQstat() throws Exception {
File instanceQstat = new File(temporaryFolder.getRoot(), "instanceQStat");
setupAuth(instanceQstat);
Run.setEmbedded(true);
Artemis.main("create", instanceQstat.getAbsolutePath(), "--silent", "--no-fsync", "--no-autotune", "--no-web", "--require-login");
System.setProperty("artemis.instance", instanceQstat.getAbsolutePath());
Object result = Artemis.internalExecute("run");
ActiveMQServer activeMQServer = ((Pair<ManagementContext, ActiveMQServer>)result).getB();
try {
final int COUNT = 20_000;
for (int i = 0; i < COUNT; i++) {
activeMQServer.createQueue(new QueueConfiguration("" + i));
}
TestActionContext context = new TestActionContext();
StatQueue statQueue = new StatQueue();
statQueue.setUser("admin");
statQueue.setPassword("admin");
statQueue.setMaxRows(COUNT);
statQueue.execute(context);
} finally {
stopServer();
}
}
@Test
public void testQstatColumnWidth() throws Exception {

View File

@ -23,6 +23,7 @@ import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import org.apache.activemq.artemis.api.core.management.Attribute;
import org.apache.activemq.artemis.api.core.management.Operation;
@ -30,52 +31,76 @@ import org.apache.activemq.artemis.api.core.management.Parameter;
public class MBeanInfoHelper {
private static ConcurrentHashMap<Class, MBeanAttributeInfo[]> attributesInfoCache = new ConcurrentHashMap<>();
private static ConcurrentHashMap<Class, MBeanOperationInfo[]> operationsInfoCache = new ConcurrentHashMap<>();
public static MBeanOperationInfo[] getMBeanOperationsInfo(final Class mbeanInterface) {
List<MBeanOperationInfo> operations = new ArrayList<>();
if (operationsInfoCache.containsKey(mbeanInterface)) {
return operationsInfoCache.get(mbeanInterface);
} else {
List<MBeanOperationInfo> operations = new ArrayList<>();
for (Method method : mbeanInterface.getMethods()) {
if (!MBeanInfoHelper.isGetterMethod(method) && !MBeanInfoHelper.isSetterMethod(method) &&
!MBeanInfoHelper.isIsBooleanMethod(method)) {
operations.add(MBeanInfoHelper.getOperationInfo(method));
for (Method method : mbeanInterface.getMethods()) {
if (!MBeanInfoHelper.isGetterMethod(method) && !MBeanInfoHelper.isSetterMethod(method) &&
!MBeanInfoHelper.isIsBooleanMethod(method)) {
operations.add(MBeanInfoHelper.getOperationInfo(method));
}
}
MBeanOperationInfo[] result = operations.toArray(new MBeanOperationInfo[operations.size()]);
operationsInfoCache.put(mbeanInterface, result);
return result;
}
return operations.toArray(new MBeanOperationInfo[operations.size()]);
}
public static MBeanAttributeInfo[] getMBeanAttributesInfo(final Class mbeanInterface) {
List<MBeanAttributeInfo> tempAttributes = new ArrayList<>();
List<MBeanAttributeInfo> finalAttributes = new ArrayList<>();
List<String> alreadyAdded = new ArrayList<>();
if (attributesInfoCache.containsKey(mbeanInterface)) {
return attributesInfoCache.get(mbeanInterface);
} else {
List<MBeanAttributeInfo> tempAttributes = new ArrayList<>();
List<MBeanAttributeInfo> finalAttributes = new ArrayList<>();
List<String> alreadyAdded = new ArrayList<>();
for (Method method : mbeanInterface.getMethods()) {
if (MBeanInfoHelper.isGetterMethod(method) || MBeanInfoHelper.isSetterMethod(method) ||
MBeanInfoHelper.isIsBooleanMethod(method)) {
tempAttributes.add(MBeanInfoHelper.getAttributeInfo(method));
}
}
// since getters and setters will each have an MBeanAttributeInfo we need to de-duplicate
for (MBeanAttributeInfo info1 : tempAttributes) {
MBeanAttributeInfo infoToCopy = info1;
for (MBeanAttributeInfo info2 : tempAttributes) {
if (info1.getName().equals(info2.getName()) && !info1.equals(info2)) {
infoToCopy = new MBeanAttributeInfo(info1.getName(), info1.getType().equals("void") ? info2.getType() : info1.getType(), info1.getDescription(), (info1.isReadable() || info2.isReadable()), (info1.isWritable() || info2.isWritable()), (info1.isIs() || info2.isIs()));
for (Method method : mbeanInterface.getMethods()) {
if (MBeanInfoHelper.isGetterMethod(method) || MBeanInfoHelper.isSetterMethod(method) ||
MBeanInfoHelper.isIsBooleanMethod(method)) {
tempAttributes.add(MBeanInfoHelper.getAttributeInfo(method));
}
}
if (!alreadyAdded.contains(infoToCopy.getName())) {
finalAttributes.add(infoToCopy);
alreadyAdded.add(infoToCopy.getName());
}
}
return finalAttributes.toArray(new MBeanAttributeInfo[finalAttributes.size()]);
// since getters and setters will each have an MBeanAttributeInfo we need to de-duplicate
for (MBeanAttributeInfo info1 : tempAttributes) {
MBeanAttributeInfo infoToCopy = info1;
for (MBeanAttributeInfo info2 : tempAttributes) {
if (info1.getName().equals(info2.getName()) && !info1.equals(info2)) {
infoToCopy = new MBeanAttributeInfo(info1.getName(), info1.getType().equals("void") ? info2.getType() : info1.getType(), info1.getDescription(), (info1.isReadable() || info2.isReadable()), (info1.isWritable() || info2.isWritable()), (info1.isIs() || info2.isIs()));
}
}
if (!alreadyAdded.contains(infoToCopy.getName())) {
finalAttributes.add(infoToCopy);
alreadyAdded.add(infoToCopy.getName());
}
}
MBeanAttributeInfo[] result = finalAttributes.toArray(new MBeanAttributeInfo[finalAttributes.size()]);
attributesInfoCache.put(mbeanInterface, result);
return result;
}
}
public static int getAttributesInfoCacheSize() {
return attributesInfoCache.size();
}
public static int getOperationsInfoCacheSize() {
return operationsInfoCache.size();
}
public static void clearAttributesInfoCache() {
attributesInfoCache.clear();
}
public static void clearOperationsInfoCache() {
operationsInfoCache.clear();
}
private static boolean isGetterMethod(final Method method) {
if (!method.getName().equals("get") && method.getName().startsWith("get") &&

View File

@ -0,0 +1,46 @@
/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.activemq.artemis.core.management.impl;
import org.apache.activemq.artemis.api.core.management.AddressControl;
import org.apache.activemq.artemis.api.core.management.QueueControl;
import org.junit.Assert;
import org.junit.Test;
public class MBeanInfoHelperTest extends Assert {
@Test
public void testOperationsInfosCache() {
MBeanInfoHelper.clearOperationsInfoCache();
for (int i = 0; i < 10; i++) {
MBeanInfoHelper.getMBeanOperationsInfo(QueueControl.class);
MBeanInfoHelper.getMBeanOperationsInfo(AddressControl.class);
}
assertEquals(2, MBeanInfoHelper.getOperationsInfoCacheSize());
}
@Test
public void testAttributesInfosCache() {
MBeanInfoHelper.clearAttributesInfoCache();
for (int i = 0; i < 10; i++) {
MBeanInfoHelper.getMBeanAttributesInfo(QueueControl.class);
MBeanInfoHelper.getMBeanAttributesInfo(AddressControl.class);
}
assertEquals(2, MBeanInfoHelper.getAttributesInfoCacheSize());
}
}

View File

@ -129,7 +129,7 @@
<resteasy.version>3.15.0.Final</resteasy.version>
<slf4j.version>1.7.36</slf4j.version>
<qpid.jms.version>1.5.0</qpid.jms.version>
<johnzon.version>0.9.5</johnzon.version>
<johnzon.version>1.2.16</johnzon.version>
<hawtbuff.version>1.11</hawtbuff.version>
<jb.logmanager.version>2.1.10.Final</jb.logmanager.version>
<jb.slf4j-jboss-logmanager.version>1.0.4.GA</jb.slf4j-jboss-logmanager.version>