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    }