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    }