/** * 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.management; import javax.jms.Destination; import javax.jms.MessageConsumer; import javax.jms.MessageProducer; import javax.jms.Session; import org.apache.activemq.util.IndentPrinter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Statistics for a JMS endpoint, typically a MessageProducer or MessageConsumer * but this class can also be used to represent statistics on a * {@link Destination} as well. * * */ public class JMSEndpointStatsImpl extends StatsImpl { private static final Logger LOG = LoggerFactory.getLogger(JMSEndpointStatsImpl.class); protected CountStatisticImpl messageCount; protected CountStatisticImpl pendingMessageCount; protected CountStatisticImpl expiredMessageCount; protected TimeStatisticImpl messageWaitTime; protected TimeStatisticImpl messageRateTime; /** * This constructor is used to create statistics for a * {@link MessageProducer} or {@link MessageConsumer} as it passes in a * {@link Session} parent statistic. * * @param sessionStats */ public JMSEndpointStatsImpl(JMSSessionStatsImpl sessionStats) { this(); setParent(messageCount, sessionStats.getMessageCount()); setParent(pendingMessageCount, sessionStats.getPendingMessageCount()); setParent(expiredMessageCount, sessionStats.getExpiredMessageCount()); setParent(messageWaitTime, sessionStats.getMessageWaitTime()); setParent(messageRateTime, sessionStats.getMessageRateTime()); } /** * This constructor is typically used to create a statistics object for a * {@link Destination} */ public JMSEndpointStatsImpl() { this(new CountStatisticImpl("messageCount", "Number of messages processed"), new CountStatisticImpl("pendingMessageCount", "Number of pending messages"), new CountStatisticImpl("expiredMessageCount", "Number of expired messages"), new TimeStatisticImpl("messageWaitTime", "Time spent by a message before being delivered"), new TimeStatisticImpl("messageRateTime", "Time taken to process a message (thoughtput rate)")); } public JMSEndpointStatsImpl(CountStatisticImpl messageCount, CountStatisticImpl pendingMessageCount, CountStatisticImpl expiredMessageCount, TimeStatisticImpl messageWaitTime, TimeStatisticImpl messageRateTime) { this.messageCount = messageCount; this.pendingMessageCount = pendingMessageCount; this.expiredMessageCount = expiredMessageCount; this.messageWaitTime = messageWaitTime; this.messageRateTime = messageRateTime; // lets add named stats addStatistic("messageCount", messageCount); addStatistic("pendingMessageCount", pendingMessageCount); addStatistic("expiredMessageCount", expiredMessageCount); addStatistic("messageWaitTime", messageWaitTime); addStatistic("messageRateTime", messageRateTime); } public synchronized void reset() { super.reset(); messageCount.reset(); messageRateTime.reset(); pendingMessageCount.reset(); expiredMessageCount.reset(); messageWaitTime.reset(); } public CountStatisticImpl getMessageCount() { return messageCount; } public CountStatisticImpl getPendingMessageCount() { return pendingMessageCount; } public CountStatisticImpl getExpiredMessageCount() { return expiredMessageCount; } public TimeStatisticImpl getMessageRateTime() { return messageRateTime; } public TimeStatisticImpl getMessageWaitTime() { return messageWaitTime; } public String toString() { StringBuffer buffer = new StringBuffer(); buffer.append(messageCount); buffer.append(" "); buffer.append(messageRateTime); buffer.append(" "); buffer.append(pendingMessageCount); buffer.append(" "); buffer.append(expiredMessageCount); buffer.append(" "); buffer.append(messageWaitTime); return buffer.toString(); } public void onMessage() { if (enabled) { long start = messageCount.getLastSampleTime(); messageCount.increment(); long end = messageCount.getLastSampleTime(); messageRateTime.addTime(end - start); } } @Override public void setEnabled(boolean enabled) { super.setEnabled(enabled); messageCount.setEnabled(enabled); messageRateTime.setEnabled(enabled); pendingMessageCount.setEnabled(enabled); expiredMessageCount.setEnabled(enabled); messageWaitTime.setEnabled(enabled); } public void dump(IndentPrinter out) { out.printIndent(); out.println(messageCount); out.printIndent(); out.println(messageRateTime); out.printIndent(); out.println(pendingMessageCount); out.printIndent(); out.println(messageRateTime); out.printIndent(); out.println(expiredMessageCount); out.printIndent(); out.println(messageWaitTime); } // Implementation methods // ------------------------------------------------------------------------- protected void setParent(CountStatisticImpl child, CountStatisticImpl parent) { if (child instanceof CountStatisticImpl && parent instanceof CountStatisticImpl) { CountStatisticImpl c = (CountStatisticImpl)child; c.setParent((CountStatisticImpl)parent); } else { LOG.warn("Cannot associate endpoint counters with session level counters as they are not both CountStatisticImpl clases. Endpoint: " + child + " session: " + parent); } } protected void setParent(TimeStatisticImpl child, TimeStatisticImpl parent) { if (child instanceof TimeStatisticImpl && parent instanceof TimeStatisticImpl) { TimeStatisticImpl c = (TimeStatisticImpl)child; c.setParent((TimeStatisticImpl)parent); } else { LOG.warn("Cannot associate endpoint counters with session level counters as they are not both TimeStatisticImpl clases. Endpoint: " + child + " session: " + parent); } } }