001 /** 002 * 003 * Copyright 2004 Protique Ltd 004 * 005 * Licensed under the Apache License, Version 2.0 (the "License"); 006 * you may not use this file except in compliance with the License. 007 * You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 * 017 **/ 018 package org.activemq.management; 019 020 import java.util.List; 021 import javax.management.j2ee.statistics.*; 022 import org.activemq.ActiveMQMessageConsumer; 023 import org.activemq.ActiveMQMessageProducer; 024 import org.activemq.util.IndentPrinter; 025 026 /** 027 * Statistics for a JMS session 028 * 029 * @version $Revision: 1.1.1.1 $ 030 */ 031 public class JMSSessionStatsImpl extends StatsImpl { 032 private List producers; 033 private List consumers; 034 private CountStatisticImpl messageCount; 035 private CountStatisticImpl pendingMessageCount; 036 private CountStatisticImpl expiredMessageCount; 037 private TimeStatisticImpl messageWaitTime; 038 private CountStatisticImpl durableSubscriptionCount; 039 040 private TimeStatisticImpl messageRateTime; 041 042 public JMSSessionStatsImpl(List producers, List consumers) { 043 this.producers = producers; 044 this.consumers = consumers; 045 this.messageCount = new CountStatisticImpl("messageCount", "Number of messages exchanged"); 046 this.pendingMessageCount = new CountStatisticImpl("pendingMessageCount", "Number of pending messages"); 047 this.expiredMessageCount = new CountStatisticImpl("expiredMessageCount", "Number of expired messages"); 048 this.messageWaitTime = new TimeStatisticImpl("messageWaitTime", "Time spent by a message before being delivered"); 049 this.durableSubscriptionCount = new CountStatisticImpl("durableSubscriptionCount", "The number of durable subscriptions"); 050 this.messageWaitTime = new TimeStatisticImpl("messageWaitTime", "Time spent by a message before being delivered"); 051 this.messageRateTime = new TimeStatisticImpl("messageRateTime", "Time taken to process a message (thoughtput rate)"); 052 053 // lets add named stats 054 addStatistic("messageCount", messageCount); 055 addStatistic("pendingMessageCount", pendingMessageCount); 056 addStatistic("expiredMessageCount", expiredMessageCount); 057 addStatistic("messageWaitTime", messageWaitTime); 058 addStatistic("durableSubscriptionCount", durableSubscriptionCount); 059 addStatistic("messageRateTime", messageRateTime); 060 } 061 062 public JMSProducerStatsImpl[] getProducers() { 063 // lets make a snapshot before we process them 064 Object[] producerArray = producers.toArray(); 065 int size = producerArray.length; 066 JMSProducerStatsImpl[] answer = new JMSProducerStatsImpl[size]; 067 for (int i = 0; i < size; i++) { 068 ActiveMQMessageProducer producer = (ActiveMQMessageProducer) producerArray[i]; 069 answer[i] = producer.getProducerStats(); 070 } 071 return answer; 072 } 073 074 public JMSConsumerStatsImpl[] getConsumers() { 075 // lets make a snapshot before we process them 076 Object[] consumerArray = consumers.toArray(); 077 int size = consumerArray.length; 078 JMSConsumerStatsImpl[] answer = new JMSConsumerStatsImpl[size]; 079 for (int i = 0; i < size; i++) { 080 ActiveMQMessageConsumer consumer = (ActiveMQMessageConsumer) consumerArray[i]; 081 answer[i] = consumer.getConsumerStats(); 082 } 083 return answer; 084 } 085 086 public void reset() { 087 super.reset(); 088 JMSConsumerStatsImpl[] cstats = getConsumers(); 089 for (int i = 0, size = cstats.length; i < size; i++) { 090 Statistic stat = (Statistic) cstats[i]; 091 if (stat instanceof Resettable) { 092 Resettable r = (Resettable) stat; 093 r.reset(); 094 } 095 } 096 JMSProducerStatsImpl[] pstats = getProducers(); 097 for (int i = 0, size = pstats.length; i < size; i++) { 098 Statistic stat = (Statistic) pstats[i]; 099 if (stat instanceof Resettable) { 100 Resettable r = (Resettable) stat; 101 r.reset(); 102 } 103 } 104 } 105 106 public CountStatisticImpl getMessageCount() { 107 return messageCount; 108 } 109 110 public CountStatisticImpl getPendingMessageCount() { 111 return pendingMessageCount; 112 } 113 114 public CountStatisticImpl getExpiredMessageCount() { 115 return expiredMessageCount; 116 } 117 118 public TimeStatisticImpl getMessageWaitTime() { 119 return messageWaitTime; 120 } 121 122 public CountStatisticImpl getDurableSubscriptionCount() { 123 return durableSubscriptionCount; 124 } 125 126 public TimeStatisticImpl getMessageRateTime() { 127 return messageRateTime; 128 } 129 130 public String toString() { 131 StringBuffer buffer = new StringBuffer(" "); 132 buffer.append(messageCount); 133 buffer.append(" "); 134 buffer.append(messageRateTime); 135 buffer.append(" "); 136 buffer.append(pendingMessageCount); 137 buffer.append(" "); 138 buffer.append(expiredMessageCount); 139 buffer.append(" "); 140 buffer.append(messageWaitTime); 141 buffer.append(" "); 142 buffer.append(durableSubscriptionCount); 143 144 buffer.append(" producers{ "); 145 JMSProducerStatsImpl[] producerArray = getProducers(); 146 for (int i = 0; i < producerArray.length; i++) { 147 if (i > 0) { 148 buffer.append(", "); 149 } 150 buffer.append(Integer.toString(i)); 151 buffer.append(" = "); 152 buffer.append(producerArray[i]); 153 } 154 buffer.append(" } consumers{ "); 155 JMSConsumerStatsImpl[] consumerArray = getConsumers(); 156 for (int i = 0; i < consumerArray.length; i++) { 157 if (i > 0) { 158 buffer.append(", "); 159 } 160 buffer.append(Integer.toString(i)); 161 buffer.append(" = "); 162 buffer.append(consumerArray[i]); 163 } 164 buffer.append(" }"); 165 return buffer.toString(); 166 } 167 168 public void dump(IndentPrinter out) { 169 out.printIndent(); 170 out.println(messageCount); 171 out.printIndent(); 172 out.println(messageRateTime); 173 out.printIndent(); 174 out.println(pendingMessageCount); 175 out.printIndent(); 176 out.println(expiredMessageCount); 177 out.printIndent(); 178 out.println(messageWaitTime); 179 out.printIndent(); 180 out.println(durableSubscriptionCount); 181 out.println(); 182 183 out.printIndent(); 184 out.println("producers {"); 185 out.incrementIndent(); 186 JMSProducerStatsImpl[] producerArray = getProducers(); 187 for (int i = 0; i < producerArray.length; i++) { 188 JMSProducerStatsImpl producer = (JMSProducerStatsImpl) producerArray[i]; 189 producer.dump(out); 190 } 191 out.decrementIndent(); 192 out.printIndent(); 193 out.println("}"); 194 195 out.printIndent(); 196 out.println("consumers {"); 197 out.incrementIndent(); 198 JMSConsumerStatsImpl[] consumerArray = getConsumers(); 199 for (int i = 0; i < consumerArray.length; i++) { 200 JMSConsumerStatsImpl consumer = (JMSConsumerStatsImpl) consumerArray[i]; 201 consumer.dump(out); 202 } 203 out.decrementIndent(); 204 out.printIndent(); 205 out.println("}"); 206 } 207 208 public void onCreateDurableSubscriber() { 209 durableSubscriptionCount.increment(); 210 } 211 212 public void onRemoveDurableSubscriber() { 213 durableSubscriptionCount.decrement(); 214 } 215 }