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.benchmark;
019
020 import EDU.oswego.cs.dl.util.concurrent.SynchronizedInt;
021 import org.activemq.ActiveMQConnectionFactory;
022 import org.activemq.util.IdGenerator;
023
024 import javax.jms.Connection;
025 import javax.jms.Destination;
026 import javax.jms.JMSException;
027 import javax.jms.Session;
028 import java.text.NumberFormat;
029 import java.util.ArrayList;
030 import java.util.List;
031
032 /**
033 * Abstract base class for some simple benchmark tools
034 *
035 * @author James Strachan
036 * @version $Revision$
037 */
038 public class BenchmarkSupport {
039
040 protected int connectionCount = 1;
041 protected int batch = 1000;
042 protected Destination destination;
043 protected boolean embeddedBroker = false;
044 private boolean topic = true;
045 private boolean durable = false;
046
047 private ActiveMQConnectionFactory factory;
048 private String url;
049 protected String[] subjects;
050 private long time = System.currentTimeMillis();
051 private int counter;
052 private List resources = new ArrayList();
053 private NumberFormat formatter = NumberFormat.getInstance();
054 private SynchronizedInt connectionCounter = new SynchronizedInt(0);
055 private IdGenerator idGenerator = new IdGenerator();
056
057 public BenchmarkSupport() {
058 }
059
060 public void start() {
061 System.out.println("Using: " + connectionCount + " connection(s)");
062 subjects = new String[connectionCount];
063 for (int i = 0; i < connectionCount; i++) {
064 subjects[i] = "BENCHMARK.FEED" + i;
065 }
066 if (useTimerLoop()) {
067 Thread timer = new Thread() {
068 public void run() {
069 timerLoop();
070 }
071 };
072 timer.start();
073 }
074 }
075
076 public String getUrl() {
077 return url;
078 }
079
080 public void setUrl(String url) {
081 this.url = url;
082 }
083
084 public boolean isTopic() {
085 return topic;
086 }
087
088 public void setTopic(boolean topic) {
089 this.topic = topic;
090 }
091
092 public ActiveMQConnectionFactory getFactory() {
093 return factory;
094 }
095
096 public void setFactory(ActiveMQConnectionFactory factory) {
097 this.factory = factory;
098 }
099
100 public void setSubject(String subject) {
101 connectionCount = 1;
102 subjects = new String[]{subject};
103 }
104
105 public boolean isDurable() {
106 return durable;
107 }
108
109 public void setDurable(boolean durable) {
110 this.durable = durable;
111 }
112
113 public boolean isEmbeddedBroker() {
114 return embeddedBroker;
115 }
116
117 public void setEmbeddedBroker(boolean embeddedBroker) {
118 this.embeddedBroker = embeddedBroker;
119 }
120
121 public int getConnectionCount() {
122 return connectionCount;
123 }
124
125 public void setConnectionCount(int connectionCount) {
126 this.connectionCount = connectionCount;
127 }
128
129 protected Session createSession() throws JMSException {
130 if (factory == null) {
131 factory = createFactory();
132 }
133 Connection connection = factory.createConnection();
134 int value = connectionCounter.increment();
135 System.out.println("Created connection: " + value + " = " + connection);
136 if (durable) {
137 connection.setClientID(idGenerator.generateId());
138 }
139 addResource(connection);
140 connection.start();
141
142 Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
143 addResource(session);
144 return session;
145 }
146
147 protected ActiveMQConnectionFactory createFactory() {
148 ActiveMQConnectionFactory answer = new ActiveMQConnectionFactory(getUrl());
149 if (embeddedBroker) {
150 answer.setUseEmbeddedBroker(true);
151 }
152 return answer;
153 }
154
155 protected synchronized void count(int count) {
156 counter += count;
157 /*
158 if (counter > batch) {
159 counter = 0;
160 long current = System.currentTimeMillis();
161 double end = current - time;
162 end /= 1000;
163 time = current;
164
165 System.out.println("Processed " + batch + " messages in " + end + " (secs)");
166 }
167 */
168 }
169
170 protected synchronized int resetCount() {
171 int answer = counter;
172 counter = 0;
173 return answer;
174 }
175
176
177 protected void timerLoop() {
178 int times = 0;
179 int total = 0;
180 int dumpVmStatsFrequency = 10;
181 Runtime runtime = Runtime.getRuntime();
182
183 while (true) {
184 try {
185 Thread.sleep(1000);
186 }
187 catch (InterruptedException e) {
188 e.printStackTrace();
189 }
190 int processed = resetCount();
191 double average = 0;
192 if (processed > 0) {
193 total += processed;
194 times++;
195 }
196 if (times > 0) {
197 average = total / times;
198 }
199
200 long oldtime = time;
201 time = System.currentTimeMillis();
202
203 double diff = time - oldtime;
204
205 System.out.println(getClass().getName() + " Processed: " + processed + " messages this second. Average: " + average);
206
207 if ((times % dumpVmStatsFrequency) == 0 && times != 0) {
208 System.out.println("Used memory: " + asMemoryString(runtime.totalMemory() - runtime.freeMemory())
209 + " Free memory: " + asMemoryString(runtime.freeMemory())
210 + " Total memory: " + asMemoryString(runtime.totalMemory())
211 + " Max memory: " + asMemoryString(runtime.maxMemory()));
212 }
213
214 }
215 }
216
217 protected String asMemoryString(long value) {
218 return formatter.format(value / 1024) + " K";
219 }
220
221 protected boolean useTimerLoop() {
222 return true;
223 }
224
225 protected Destination createDestination(Session session, String subject) throws JMSException {
226 if (topic) {
227 return session.createTopic(subject);
228 }
229 else {
230 return session.createQueue(subject);
231 }
232 }
233
234 protected void addResource(Object resource) {
235 resources.add(resource);
236 }
237
238 protected static boolean parseBoolean(String text) {
239 return text.equalsIgnoreCase("true");
240 }
241 }