/**
*
* Copyright 2004 Protique Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
**/
package org.codehaus.activemq.management;
import org.codehaus.activemq.ActiveMQMessageConsumer;
import org.codehaus.activemq.ActiveMQMessageProducer;
import org.codehaus.activemq.util.IndentPrinter;
import javax.management.j2ee.statistics.CountStatistic;
import javax.management.j2ee.statistics.JMSConsumerStats;
import javax.management.j2ee.statistics.JMSProducerStats;
import javax.management.j2ee.statistics.JMSSessionStats;
import javax.management.j2ee.statistics.TimeStatistic;
import java.util.List;
/**
* Statistics for a JMS session
*
* @version $Revision: 1.6 $
*/
public class JMSSessionStatsImpl extends StatsImpl implements JMSSessionStats {
private List producers;
private List consumers;
private CountStatistic messageCount;
private CountStatistic pendingMessageCount;
private CountStatistic expiredMessageCount;
private TimeStatistic messageWaitTime;
private CountStatisticImpl durableSubscriptionCount;
private TimeStatisticImpl messageRateTime;
public JMSSessionStatsImpl(List producers, List consumers) {
this.producers = producers;
this.consumers = consumers;
this.messageCount = new CountStatisticImpl("messageCount", "Number of messages exchanged");
this.pendingMessageCount = new CountStatisticImpl("pendingMessageCount", "Number of pending messages");
this.expiredMessageCount = new CountStatisticImpl("expiredMessageCount", "Number of expired messages");
this.messageWaitTime = new TimeStatisticImpl("messageWaitTime", "Time spent by a message before being delivered");
this.durableSubscriptionCount = new CountStatisticImpl("durableSubscriptionCount", "The number of durable subscriptions");
this.messageWaitTime = new TimeStatisticImpl("messageWaitTime", "Time spent by a message before being delivered");
this.messageRateTime = new TimeStatisticImpl("messageRateTime", "Time taken to process a message (thoughtput rate)");
// lets add named stats
addStatistic("messageCount", messageCount);
addStatistic("pendingMessageCount", pendingMessageCount);
addStatistic("expiredMessageCount", expiredMessageCount);
addStatistic("messageWaitTime", messageWaitTime);
addStatistic("durableSubscriptionCount", durableSubscriptionCount);
addStatistic("messageRateTime", messageRateTime);
}
public JMSProducerStats[] getProducers() {
// lets make a snapshot before we process them
Object[] producerArray = producers.toArray();
int size = producerArray.length;
JMSProducerStats[] answer = new JMSProducerStats[size];
for (int i = 0; i < size; i++) {
ActiveMQMessageProducer producer = (ActiveMQMessageProducer) producerArray[i];
answer[i] = producer.getProducerStats();
}
return answer;
}
public JMSConsumerStats[] getConsumers() {
// lets make a snapshot before we process them
Object[] consumerArray = consumers.toArray();
int size = consumerArray.length;
JMSConsumerStats[] answer = new JMSConsumerStats[size];
for (int i = 0; i < size; i++) {
ActiveMQMessageConsumer consumer = (ActiveMQMessageConsumer) consumerArray[i];
answer[i] = consumer.getConsumerStats();
}
return answer;
}
public CountStatistic getMessageCount() {
return messageCount;
}
public CountStatistic getPendingMessageCount() {
return pendingMessageCount;
}
public CountStatistic getExpiredMessageCount() {
return expiredMessageCount;
}
public TimeStatistic getMessageWaitTime() {
return messageWaitTime;
}
public CountStatistic getDurableSubscriptionCount() {
return durableSubscriptionCount;
}
public TimeStatisticImpl getMessageRateTime() {
return messageRateTime;
}
public String toString() {
StringBuffer buffer = new StringBuffer(" ");
buffer.append(messageCount);
buffer.append(" ");
buffer.append(messageRateTime);
buffer.append(" ");
buffer.append(pendingMessageCount);
buffer.append(" ");
buffer.append(expiredMessageCount);
buffer.append(" ");
buffer.append(messageWaitTime);
buffer.append(" ");
buffer.append(durableSubscriptionCount);
buffer.append(" producers{ ");
JMSProducerStats[] producerArray = getProducers();
for (int i = 0; i < producerArray.length; i++) {
if (i > 0) {
buffer.append(", ");
}
buffer.append(Integer.toString(i));
buffer.append(" = ");
buffer.append(producerArray[i]);
}
buffer.append(" } consumers{ ");
JMSConsumerStats[] consumerArray = getConsumers();
for (int i = 0; i < consumerArray.length; i++) {
if (i > 0) {
buffer.append(", ");
}
buffer.append(Integer.toString(i));
buffer.append(" = ");
buffer.append(consumerArray[i]);
}
buffer.append(" }");
return buffer.toString();
}
public void dump(IndentPrinter out) {
out.printIndent();
out.println(messageCount);
out.printIndent();
out.println(messageRateTime);
out.printIndent();
out.println(pendingMessageCount);
out.printIndent();
out.println(expiredMessageCount);
out.printIndent();
out.println(messageWaitTime);
out.printIndent();
out.println(durableSubscriptionCount);
out.println();
out.printIndent();
out.println("producers {");
out.incrementIndent();
JMSProducerStats[] producerArray = getProducers();
for (int i = 0; i < producerArray.length; i++) {
JMSProducerStatsImpl producer = (JMSProducerStatsImpl) producerArray[i];
producer.dump(out);
}
out.decrementIndent();
out.printIndent();
out.println("}");
out.printIndent();
out.println("consumers {");
out.incrementIndent();
JMSConsumerStats[] consumerArray = getConsumers();
for (int i = 0; i < consumerArray.length; i++) {
JMSConsumerStatsImpl consumer = (JMSConsumerStatsImpl) consumerArray[i];
consumer.dump(out);
}
out.decrementIndent();
out.printIndent();
out.println("}");
}
public void onCreateDurableSubscriber() {
durableSubscriptionCount.increment();
}
public void onRemoveDurableSubscriber() {
durableSubscriptionCount.decrement();
}
}