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 }