This closes #3996
This commit is contained in:
commit
c3e6ce075c
|
@ -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 {
|
||||
|
||||
|
|
|
@ -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") &&
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
}
|
2
pom.xml
2
pom.xml
|
@ -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>
|
||||
|
|
Loading…
Reference in New Issue