View Javadoc

1   /*** 
2    * 
3    * Copyright 2004 Protique Ltd
4    * 
5    * Licensed under the Apache License, Version 2.0 (the "License"); 
6    * you may not use this file except in compliance with the License. 
7    * You may obtain a copy of the License at 
8    * 
9    * http://www.apache.org/licenses/LICENSE-2.0
10   * 
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS, 
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
14   * See the License for the specific language governing permissions and 
15   * limitations under the License. 
16   * 
17   **/
18  package org.codehaus.activemq.management;
19  
20  import org.apache.commons.logging.Log;
21  import org.apache.commons.logging.LogFactory;
22  import org.codehaus.activemq.util.IndentPrinter;
23  
24  import javax.jms.Message;
25  import javax.management.j2ee.statistics.CountStatistic;
26  import javax.management.j2ee.statistics.JMSEndpointStats;
27  import javax.management.j2ee.statistics.TimeStatistic;
28  
29  /***
30   * Statistics for a JMS endpoint
31   *
32   * @version $Revision: 1.8 $
33   */
34  public class JMSEndpointStatsImpl extends StatsImpl implements JMSEndpointStats {
35      private static final Log log = LogFactory.getLog(JMSEndpointStatsImpl.class);
36  
37      protected CountStatisticImpl messageCount;
38      protected CountStatisticImpl pendingMessageCount;
39      protected CountStatisticImpl expiredMessageCount;
40      protected TimeStatistic messageWaitTime;
41      protected TimeStatisticImpl messageRateTime;
42  
43      public JMSEndpointStatsImpl(JMSSessionStatsImpl sessionStats) {
44          this();
45          setParent(messageCount, sessionStats.getMessageCount());
46          setParent(pendingMessageCount, sessionStats.getPendingMessageCount());
47          setParent(expiredMessageCount, sessionStats.getExpiredMessageCount());
48          setParent(messageWaitTime, sessionStats.getMessageWaitTime());
49          setParent(messageRateTime, sessionStats.getMessageRateTime());
50      }
51  
52      protected void setParent(CountStatistic child, CountStatistic parent) {
53          if (child instanceof CountStatisticImpl && parent instanceof CountStatisticImpl) {
54              CountStatisticImpl c = (CountStatisticImpl) child;
55              c.setParent((CountStatisticImpl) parent);
56          }
57          else {
58              log.warn("Cannot associate endpoint counters with session level counters as they are not both CountStatisticImpl clases. Endpoint: " + child + " session: " + parent);
59          }
60      }
61  
62      protected void setParent(TimeStatistic child, TimeStatistic parent) {
63          if (child instanceof TimeStatisticImpl && parent instanceof TimeStatisticImpl) {
64              TimeStatisticImpl c = (TimeStatisticImpl) child;
65              c.setParent((TimeStatisticImpl) parent);
66          }
67          else {
68              log.warn("Cannot associate endpoint counters with session level counters as they are not both TimeStatisticImpl clases. Endpoint: " + child + " session: " + parent);
69          }
70      }
71  
72  
73      public JMSEndpointStatsImpl() {
74          this(new CountStatisticImpl("messageCount", "Number of messages processed"),
75                  new CountStatisticImpl("pendingMessageCount", "Number of pending messages"),
76                  new CountStatisticImpl("expiredMessageCount", "Number of expired messages"),
77                  new TimeStatisticImpl("messageWaitTime", "Time spent by a message before being delivered"),
78                  new TimeStatisticImpl("messageRateTime", "Time taken to process a message (thoughtput rate)"));
79      }
80  
81      public JMSEndpointStatsImpl(CountStatisticImpl messageCount, CountStatisticImpl pendingMessageCount, CountStatisticImpl expiredMessageCount, TimeStatisticImpl messageWaitTime, TimeStatisticImpl messageRateTime) {
82          this.messageCount = messageCount;
83          this.pendingMessageCount = pendingMessageCount;
84          this.expiredMessageCount = expiredMessageCount;
85          this.messageWaitTime = messageWaitTime;
86          this.messageRateTime = messageRateTime;
87  
88          // lets add named stats
89          addStatistic("messageCount", messageCount);
90          addStatistic("pendingMessageCount", pendingMessageCount);
91          addStatistic("expiredMessageCount", expiredMessageCount);
92          addStatistic("messageWaitTime", messageWaitTime);
93          addStatistic("messageRateTime", messageRateTime);
94      }
95  
96      public CountStatistic getMessageCount() {
97          return messageCount;
98      }
99  
100     public CountStatistic getPendingMessageCount() {
101         return pendingMessageCount;
102     }
103 
104     public CountStatistic getExpiredMessageCount() {
105         return expiredMessageCount;
106     }
107 
108     public TimeStatistic getMessageWaitTime() {
109         return messageWaitTime;
110     }
111 
112     public String toString() {
113         StringBuffer buffer = new StringBuffer();
114         buffer.append(messageCount);
115         buffer.append(" ");
116         buffer.append(messageRateTime);
117         buffer.append(" ");
118         buffer.append(pendingMessageCount);
119         buffer.append(" ");
120         buffer.append(expiredMessageCount);
121         buffer.append(" ");
122         buffer.append(messageWaitTime);
123         return buffer.toString();
124     }
125 
126     public void onMessage(Message message) {
127         long start = messageCount.getLastSampleTime();
128         messageCount.increment();
129         long end = messageCount.getLastSampleTime();
130         messageRateTime.addTime(end - start);
131     }
132 
133     public void dump(IndentPrinter out) {
134         out.printIndent();
135         out.println(messageCount);
136         out.printIndent();
137         out.println(messageRateTime);
138         out.printIndent();
139         out.println(pendingMessageCount);
140         out.printIndent();
141         out.println(messageRateTime);
142         out.printIndent();
143         out.println(expiredMessageCount);
144         out.printIndent();
145         out.println(messageWaitTime);
146     }
147 }