org.apache.activemq.broker.jmx.DestinationView Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of activemq-broker Show documentation
Show all versions of activemq-broker Show documentation
The ActiveMQ Message Broker implementation
/**
* 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
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* 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.broker.jmx;
import java.io.IOException;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import jakarta.jms.Connection;
import jakarta.jms.InvalidSelectorException;
import jakarta.jms.MessageProducer;
import jakarta.jms.Session;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import javax.management.openmbean.CompositeData;
import javax.management.openmbean.CompositeDataSupport;
import javax.management.openmbean.CompositeType;
import javax.management.openmbean.OpenDataException;
import javax.management.openmbean.TabularData;
import javax.management.openmbean.TabularDataSupport;
import javax.management.openmbean.TabularType;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.broker.jmx.OpenTypeSupport.OpenTypeFactory;
import org.apache.activemq.broker.region.Destination;
import org.apache.activemq.broker.region.Subscription;
import org.apache.activemq.broker.region.policy.AbortSlowConsumerStrategy;
import org.apache.activemq.broker.region.policy.SlowConsumerStrategy;
import org.apache.activemq.command.ActiveMQDestination;
import org.apache.activemq.command.ActiveMQMessage;
import org.apache.activemq.command.ActiveMQTextMessage;
import org.apache.activemq.command.Message;
import org.apache.activemq.filter.BooleanExpression;
import org.apache.activemq.filter.NonCachedMessageEvaluationContext;
import org.apache.activemq.selector.SelectorParser;
import org.apache.activemq.store.MessageStore;
import org.apache.activemq.util.URISupport;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class DestinationView implements DestinationViewMBean {
private static final Logger LOG = LoggerFactory.getLogger(DestinationViewMBean.class);
protected final Destination destination;
protected final ManagedRegionBroker broker;
public DestinationView(ManagedRegionBroker broker, Destination destination) {
this.broker = broker;
this.destination = destination;
}
public void gc() {
destination.gc();
}
@Override
public String getName() {
return destination.getName();
}
@Override
public void resetStatistics() {
destination.getDestinationStatistics().reset();
}
@Override
public long getEnqueueCount() {
return destination.getDestinationStatistics().getEnqueues().getCount();
}
@Override
public long getDequeueCount() {
return destination.getDestinationStatistics().getDequeues().getCount();
}
@Override
public long getForwardCount() {
return destination.getDestinationStatistics().getForwards().getCount();
}
@Override
public long getDispatchCount() {
return destination.getDestinationStatistics().getDispatched().getCount();
}
@Override
public long getDuplicateFromStoreCount() {
return destination.getDestinationStatistics().getDuplicateFromStore().getCount();
}
@Override
public long getInFlightCount() {
return destination.getDestinationStatistics().getInflight().getCount();
}
@Override
public long getExpiredCount() {
return destination.getDestinationStatistics().getExpired().getCount();
}
@Override
public long getConsumerCount() {
return destination.getDestinationStatistics().getConsumers().getCount();
}
@Override
public long getQueueSize() {
return destination.getDestinationStatistics().getMessages().getCount();
}
@Override
public long getStoreMessageSize() {
MessageStore messageStore = destination.getMessageStore();
return messageStore != null ? messageStore.getMessageStoreStatistics().getMessageSize().getTotalSize() : 0;
}
public long getMessagesCached() {
return destination.getDestinationStatistics().getMessagesCached().getCount();
}
@Override
public int getMemoryPercentUsage() {
return destination.getMemoryUsage().getPercentUsage();
}
@Override
public long getMemoryUsageByteCount() {
return destination.getMemoryUsage().getUsage();
}
@Override
public long getMemoryLimit() {
return destination.getMemoryUsage().getLimit();
}
@Override
public void setMemoryLimit(long limit) {
destination.getMemoryUsage().setLimit(limit);
}
@Override
public double getAverageEnqueueTime() {
return destination.getDestinationStatistics().getProcessTime().getAverageTime();
}
@Override
public int getTempUsagePercentUsage() {
return destination.getTempUsage().getPercentUsage();
}
@Override
public long getTempUsageLimit() {
return destination.getTempUsage().getLimit();
}
@Override
public void setTempUsageLimit(long limit) {
destination.getTempUsage().setLimit(limit);
}
@Override
public long getMaxEnqueueTime() {
return destination.getDestinationStatistics().getProcessTime().getMaxTime();
}
@Override
public long getMinEnqueueTime() {
return destination.getDestinationStatistics().getProcessTime().getMinTime();
}
/**
* @return the average size of a message (bytes)
*/
@Override
public long getAverageMessageSize() {
// we are okay with the size without decimals so cast to long
return (long) destination.getDestinationStatistics().getMessageSize().getAverageSize();
}
/**
* @return the max size of a message (bytes)
*/
@Override
public long getMaxMessageSize() {
return destination.getDestinationStatistics().getMessageSize().getMaxSize();
}
/**
* @return the min size of a message (bytes)
*/
@Override
public long getMinMessageSize() {
return destination.getDestinationStatistics().getMessageSize().getMinSize();
}
@Override
public boolean isPrioritizedMessages() {
return destination.isPrioritizedMessages();
}
@Override
public CompositeData[] browse() throws OpenDataException {
try {
return browse(null);
} catch (InvalidSelectorException e) {
// should not happen.
throw new RuntimeException(e);
}
}
@Override
public CompositeData[] browse(String selector) throws OpenDataException, InvalidSelectorException {
Message[] messages = destination.browse();
ArrayList c = new ArrayList();
NonCachedMessageEvaluationContext ctx = new NonCachedMessageEvaluationContext();
ctx.setDestination(destination.getActiveMQDestination());
BooleanExpression selectorExpression = selector == null ? null : SelectorParser.parse(selector);
for (int i = 0; i < messages.length; i++) {
try {
if (selectorExpression == null) {
c.add(OpenTypeSupport.convert(messages[i]));
} else {
ctx.setMessageReference(messages[i]);
if (selectorExpression.matches(ctx)) {
c.add(OpenTypeSupport.convert(messages[i]));
}
}
} catch (Throwable e) {
LOG.warn("exception browsing destination", e);
}
}
CompositeData rc[] = new CompositeData[c.size()];
c.toArray(rc);
return rc;
}
/**
* Browses the current destination returning a list of messages
*/
@Override
public List