001 /*
002 * Copyright (C) The Apache Software Foundation. All rights reserved.
003 *
004 * This software is published under the terms of the Apache Software License
005 * version 1.1, a copy of which has been included with this distribution in
006 * the LICENSE file.
007 *
008 * $Id: StopWatchMessageListener.java 155459 2005-02-26 13:24:44Z dirkv $
009 */
010
011 package org.apache.commons.messenger.tool;
012
013 import javax.jms.Destination;
014 import javax.jms.JMSException;
015 import javax.jms.Message;
016 import javax.jms.MessageListener;
017
018 import org.apache.commons.logging.Log;
019 import org.apache.commons.logging.LogFactory;
020
021 /**
022 * A simple StopWatch Message Listener for wrapping another MessageListener
023 * to determine its performance.
024 *
025 * @author James Strachan
026 */
027 public class StopWatchMessageListener implements MessageListener {
028
029 /** The Log to which logging calls will be made. */
030 private Log log = LogFactory.getLog( StopWatchMessageListener.class );
031
032 /** the underlying MessageListener */
033 private MessageListener messageListener;
034
035 /** the number of messages processed */
036 private int count;
037
038 /** the message group size */
039 private int groupSize = 1000;
040
041 /** the time that the batch started processing */
042 private long startTime;
043
044 public StopWatchMessageListener() {
045 }
046
047 public StopWatchMessageListener(MessageListener messageListener) {
048 this.messageListener = messageListener;
049 }
050
051 // MessageListener interface
052 //-------------------------------------------------------------------------
053 public void onMessage(Message message) {
054 if ( count == 0 ) {
055 startTime = System.currentTimeMillis();
056 }
057 if ( messageListener != null ) {
058 messageListener.onMessage(message);
059 }
060
061 if ( ++count == groupSize ) {
062 long elapsed = System.currentTimeMillis() - startTime;
063 double timePerMessage = elapsed;
064 timePerMessage /= count;
065
066 double messagesPerSecond = 1000;
067 messagesPerSecond /= timePerMessage;
068
069 Destination destination = null;
070 try {
071 destination = message.getJMSDestination();
072 }
073 catch (JMSException e) {
074 // ignore
075 }
076 log.info( "Time to process " + count + " messages: " + elapsed + " millis on: " + destination );
077 log.info( "Average number of messages per second: " + messagesPerSecond );
078 count = 0;
079 }
080 }
081
082
083 // Properties
084 //-------------------------------------------------------------------------
085
086 /**
087 * @return the number of messages in the group before the performance statistics are logged
088 */
089 public int getGroupSize() {
090 return groupSize;
091 }
092
093 /**
094 * Sets the number of messages in the group before the performance statistics are logged
095 */
096 public void setGroupSize(int groupSize) {
097 this.groupSize = groupSize;
098 }
099
100
101 /**
102 * @return the logger to which statistic messages will be sent
103 */
104 public Log getLog() {
105 return log;
106 }
107
108 /**
109 * Sets the logger to which statistic messages will be sent
110 */
111 public void setLog(Log log) {
112 this.log = log;
113 }
114
115 /**
116 * @return the MessageListener which this listener delegates to
117 */
118 public MessageListener getMessageListener() {
119 return messageListener;
120 }
121
122 /**
123 * Sets the MessageListener which this listener delegates to, which can be null.
124 */
125 public void setMessageListener(MessageListener messageListener) {
126 this.messageListener = messageListener;
127 }
128
129 }