001 /**
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. 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 package org.apache.activemq.management;
018
019 import java.util.List;
020
021 import org.apache.activemq.ActiveMQMessageConsumer;
022 import org.apache.activemq.ActiveMQMessageProducer;
023 import org.apache.activemq.util.IndentPrinter;
024
025 /**
026 * Statistics for a JMS session
027 *
028 *
029 */
030 public class JMSSessionStatsImpl extends StatsImpl {
031 private List producers;
032 private List consumers;
033 private CountStatisticImpl messageCount;
034 private CountStatisticImpl pendingMessageCount;
035 private CountStatisticImpl expiredMessageCount;
036 private TimeStatisticImpl messageWaitTime;
037 private CountStatisticImpl durableSubscriptionCount;
038
039 private TimeStatisticImpl messageRateTime;
040
041 public JMSSessionStatsImpl(List producers, List consumers) {
042 this.producers = producers;
043 this.consumers = consumers;
044 this.messageCount = new CountStatisticImpl("messageCount", "Number of messages exchanged");
045 this.pendingMessageCount = new CountStatisticImpl("pendingMessageCount", "Number of pending messages");
046 this.expiredMessageCount = new CountStatisticImpl("expiredMessageCount", "Number of expired messages");
047 this.messageWaitTime = new TimeStatisticImpl("messageWaitTime",
048 "Time spent by a message before being delivered");
049 this.durableSubscriptionCount = new CountStatisticImpl("durableSubscriptionCount",
050 "The number of durable subscriptions");
051 this.messageWaitTime = new TimeStatisticImpl("messageWaitTime",
052 "Time spent by a message before being delivered");
053 this.messageRateTime = new TimeStatisticImpl("messageRateTime",
054 "Time taken to process a message (thoughtput rate)");
055
056 // lets add named stats
057 addStatistic("messageCount", messageCount);
058 addStatistic("pendingMessageCount", pendingMessageCount);
059 addStatistic("expiredMessageCount", expiredMessageCount);
060 addStatistic("messageWaitTime", messageWaitTime);
061 addStatistic("durableSubscriptionCount", durableSubscriptionCount);
062 addStatistic("messageRateTime", messageRateTime);
063 }
064
065 public JMSProducerStatsImpl[] getProducers() {
066 // lets make a snapshot before we process them
067 Object[] producerArray = producers.toArray();
068 int size = producerArray.length;
069 JMSProducerStatsImpl[] answer = new JMSProducerStatsImpl[size];
070 for (int i = 0; i < size; i++) {
071 ActiveMQMessageProducer producer = (ActiveMQMessageProducer)producerArray[i];
072 answer[i] = producer.getProducerStats();
073 }
074 return answer;
075 }
076
077 public JMSConsumerStatsImpl[] getConsumers() {
078 // lets make a snapshot before we process them
079 Object[] consumerArray = consumers.toArray();
080 int size = consumerArray.length;
081 JMSConsumerStatsImpl[] answer = new JMSConsumerStatsImpl[size];
082 for (int i = 0; i < size; i++) {
083 ActiveMQMessageConsumer consumer = (ActiveMQMessageConsumer)consumerArray[i];
084 answer[i] = consumer.getConsumerStats();
085 }
086 return answer;
087 }
088
089 public void reset() {
090 super.reset();
091 JMSConsumerStatsImpl[] cstats = getConsumers();
092 int size = cstats.length;
093 for (int i = 0; i < size; i++) {
094 cstats[i].reset();
095 }
096 JMSProducerStatsImpl[] pstats = getProducers();
097 size = pstats.length;
098 for (int i = 0; i < size; i++) {
099 pstats[i].reset();
100 }
101 }
102
103 /**
104 * @param enabled the enabled to set
105 */
106 public void setEnabled(boolean enabled) {
107 super.setEnabled(enabled);
108 JMSConsumerStatsImpl[] cstats = getConsumers();
109 int size = cstats.length;
110 for (int i = 0; i < size; i++) {
111 cstats[i].setEnabled(enabled);
112 }
113 JMSProducerStatsImpl[] pstats = getProducers();
114 size = pstats.length;
115 for (int i = 0; i < size; i++) {
116 pstats[i].setEnabled(enabled);
117 }
118
119 }
120
121 public CountStatisticImpl getMessageCount() {
122 return messageCount;
123 }
124
125 public CountStatisticImpl getPendingMessageCount() {
126 return pendingMessageCount;
127 }
128
129 public CountStatisticImpl getExpiredMessageCount() {
130 return expiredMessageCount;
131 }
132
133 public TimeStatisticImpl getMessageWaitTime() {
134 return messageWaitTime;
135 }
136
137 public CountStatisticImpl getDurableSubscriptionCount() {
138 return durableSubscriptionCount;
139 }
140
141 public TimeStatisticImpl getMessageRateTime() {
142 return messageRateTime;
143 }
144
145 public String toString() {
146 StringBuffer buffer = new StringBuffer(" ");
147 buffer.append(messageCount);
148 buffer.append(" ");
149 buffer.append(messageRateTime);
150 buffer.append(" ");
151 buffer.append(pendingMessageCount);
152 buffer.append(" ");
153 buffer.append(expiredMessageCount);
154 buffer.append(" ");
155 buffer.append(messageWaitTime);
156 buffer.append(" ");
157 buffer.append(durableSubscriptionCount);
158
159 buffer.append(" producers{ ");
160 JMSProducerStatsImpl[] producerArray = getProducers();
161 for (int i = 0; i < producerArray.length; i++) {
162 if (i > 0) {
163 buffer.append(", ");
164 }
165 buffer.append(Integer.toString(i));
166 buffer.append(" = ");
167 buffer.append(producerArray[i]);
168 }
169 buffer.append(" } consumers{ ");
170 JMSConsumerStatsImpl[] consumerArray = getConsumers();
171 for (int i = 0; i < consumerArray.length; i++) {
172 if (i > 0) {
173 buffer.append(", ");
174 }
175 buffer.append(Integer.toString(i));
176 buffer.append(" = ");
177 buffer.append(consumerArray[i]);
178 }
179 buffer.append(" }");
180 return buffer.toString();
181 }
182
183 public void dump(IndentPrinter out) {
184 out.printIndent();
185 out.println(messageCount);
186 out.printIndent();
187 out.println(messageRateTime);
188 out.printIndent();
189 out.println(pendingMessageCount);
190 out.printIndent();
191 out.println(expiredMessageCount);
192 out.printIndent();
193 out.println(messageWaitTime);
194 out.printIndent();
195 out.println(durableSubscriptionCount);
196 out.println();
197
198 out.printIndent();
199 out.println("producers {");
200 out.incrementIndent();
201 JMSProducerStatsImpl[] producerArray = getProducers();
202 for (int i = 0; i < producerArray.length; i++) {
203 JMSProducerStatsImpl producer = (JMSProducerStatsImpl)producerArray[i];
204 producer.dump(out);
205 }
206 out.decrementIndent();
207 out.printIndent();
208 out.println("}");
209
210 out.printIndent();
211 out.println("consumers {");
212 out.incrementIndent();
213 JMSConsumerStatsImpl[] consumerArray = getConsumers();
214 for (int i = 0; i < consumerArray.length; i++) {
215 JMSConsumerStatsImpl consumer = (JMSConsumerStatsImpl)consumerArray[i];
216 consumer.dump(out);
217 }
218 out.decrementIndent();
219 out.printIndent();
220 out.println("}");
221 }
222
223 public void onCreateDurableSubscriber() {
224 durableSubscriptionCount.increment();
225 }
226
227 public void onRemoveDurableSubscriber() {
228 durableSubscriptionCount.decrement();
229 }
230 }