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.broker.jmx;
018
019 import java.io.File;
020 import java.io.IOException;
021 import java.lang.reflect.InvocationTargetException;
022 import java.lang.reflect.Method;
023 import java.net.URI;
024 import java.net.URL;
025 import java.util.concurrent.atomic.AtomicInteger;
026 import javax.management.ObjectName;
027
028 import org.apache.activemq.ActiveMQConnectionMetaData;
029 import org.apache.activemq.broker.BrokerService;
030 import org.apache.activemq.broker.ConnectionContext;
031 import org.apache.activemq.broker.TransportConnector;
032 import org.apache.activemq.broker.region.Subscription;
033 import org.apache.activemq.command.ActiveMQQueue;
034 import org.apache.activemq.command.ActiveMQTopic;
035 import org.apache.activemq.command.ConsumerId;
036 import org.apache.activemq.command.ConsumerInfo;
037 import org.apache.activemq.command.RemoveSubscriptionInfo;
038 import org.apache.activemq.network.NetworkConnector;
039 import org.apache.activemq.util.BrokerSupport;
040
041 /**
042 *
043 */
044 public class BrokerView implements BrokerViewMBean {
045
046 ManagedRegionBroker broker;
047 private final BrokerService brokerService;
048 private final AtomicInteger sessionIdCounter = new AtomicInteger(0);
049 private ObjectName jmsJobScheduler;
050
051 public BrokerView(BrokerService brokerService, ManagedRegionBroker managedBroker) throws Exception {
052 this.brokerService = brokerService;
053 this.broker = managedBroker;
054 }
055
056 public ManagedRegionBroker getBroker() {
057 return broker;
058 }
059
060 public void setBroker(ManagedRegionBroker broker) {
061 this.broker = broker;
062 }
063
064 public String getBrokerId() {
065 return broker.getBrokerId().toString();
066 }
067
068 public String getBrokerName() {
069 return broker.getBrokerName();
070 }
071
072 public String getBrokerVersion() {
073 return ActiveMQConnectionMetaData.PROVIDER_VERSION;
074 }
075
076 public void gc() throws Exception {
077 brokerService.getBroker().gc();
078 }
079
080 public void start() throws Exception {
081 brokerService.start();
082 }
083
084 public void stop() throws Exception {
085 brokerService.stop();
086 }
087
088 public void stopGracefully(String connectorName, String queueName, long timeout, long pollInterval)
089 throws Exception {
090 brokerService.stopGracefully(connectorName, queueName, timeout, pollInterval);
091 }
092
093
094 public long getTotalEnqueueCount() {
095 return broker.getDestinationStatistics().getEnqueues().getCount();
096 }
097
098 public long getTotalDequeueCount() {
099 return broker.getDestinationStatistics().getDequeues().getCount();
100 }
101
102 public long getTotalConsumerCount() {
103 return broker.getDestinationStatistics().getConsumers().getCount();
104 }
105
106 public long getTotalMessageCount() {
107 return broker.getDestinationStatistics().getMessages().getCount();
108 }
109
110 public long getTotalMessagesCached() {
111 return broker.getDestinationStatistics().getMessagesCached().getCount();
112 }
113
114 public int getMemoryPercentUsage() {
115 return brokerService.getSystemUsage().getMemoryUsage().getPercentUsage();
116 }
117
118 public long getMemoryLimit() {
119 return brokerService.getSystemUsage().getMemoryUsage().getLimit();
120 }
121
122 public void setMemoryLimit(long limit) {
123 brokerService.getSystemUsage().getMemoryUsage().setLimit(limit);
124 }
125
126 public long getStoreLimit() {
127 return brokerService.getSystemUsage().getStoreUsage().getLimit();
128 }
129
130 public int getStorePercentUsage() {
131 return brokerService.getSystemUsage().getStoreUsage().getPercentUsage();
132 }
133
134
135 public long getTempLimit() {
136 return brokerService.getSystemUsage().getTempUsage().getLimit();
137 }
138
139 public int getTempPercentUsage() {
140 return brokerService.getSystemUsage().getTempUsage().getPercentUsage();
141 }
142
143 public void setStoreLimit(long limit) {
144 brokerService.getSystemUsage().getStoreUsage().setLimit(limit);
145 }
146
147 public void setTempLimit(long limit) {
148 brokerService.getSystemUsage().getTempUsage().setLimit(limit);
149 }
150
151
152 public void resetStatistics() {
153 broker.getDestinationStatistics().reset();
154 }
155
156 public void enableStatistics() {
157 broker.getDestinationStatistics().setEnabled(true);
158 }
159
160 public void disableStatistics() {
161 broker.getDestinationStatistics().setEnabled(false);
162 }
163
164 public boolean isStatisticsEnabled() {
165 return broker.getDestinationStatistics().isEnabled();
166 }
167
168 public boolean isPersistent() {
169 return brokerService.isPersistent();
170 }
171
172 public boolean isSlave() {
173 return brokerService.isSlave();
174 }
175
176 public void terminateJVM(int exitCode) {
177 System.exit(exitCode);
178 }
179
180 public ObjectName[] getTopics() {
181 return broker.getTopics();
182 }
183
184 public ObjectName[] getQueues() {
185 return broker.getQueues();
186 }
187
188 public ObjectName[] getTemporaryTopics() {
189 return broker.getTemporaryTopics();
190 }
191
192 public ObjectName[] getTemporaryQueues() {
193 return broker.getTemporaryQueues();
194 }
195
196 public ObjectName[] getTopicSubscribers() {
197 return broker.getTopicSubscribers();
198 }
199
200 public ObjectName[] getDurableTopicSubscribers() {
201 return broker.getDurableTopicSubscribers();
202 }
203
204 public ObjectName[] getQueueSubscribers() {
205 return broker.getQueueSubscribers();
206 }
207
208 public ObjectName[] getTemporaryTopicSubscribers() {
209 return broker.getTemporaryTopicSubscribers();
210 }
211
212 public ObjectName[] getTemporaryQueueSubscribers() {
213 return broker.getTemporaryQueueSubscribers();
214 }
215
216 public ObjectName[] getInactiveDurableTopicSubscribers() {
217 return broker.getInactiveDurableTopicSubscribers();
218 }
219
220 public String addConnector(String discoveryAddress) throws Exception {
221 TransportConnector connector = brokerService.addConnector(discoveryAddress);
222 connector.start();
223 return connector.getName();
224 }
225
226 public String addNetworkConnector(String discoveryAddress) throws Exception {
227 NetworkConnector connector = brokerService.addNetworkConnector(discoveryAddress);
228 connector.start();
229 return connector.getName();
230 }
231
232 public boolean removeConnector(String connectorName) throws Exception {
233 TransportConnector connector = brokerService.getConnectorByName(connectorName);
234 connector.stop();
235 return brokerService.removeConnector(connector);
236 }
237
238 public boolean removeNetworkConnector(String connectorName) throws Exception {
239 NetworkConnector connector = brokerService.getNetworkConnectorByName(connectorName);
240 connector.stop();
241 return brokerService.removeNetworkConnector(connector);
242 }
243
244 public void addTopic(String name) throws Exception {
245 broker.getContextBroker().addDestination(BrokerSupport.getConnectionContext(broker.getContextBroker()), new ActiveMQTopic(name),true);
246 }
247
248 public void addQueue(String name) throws Exception {
249 broker.getContextBroker().addDestination(BrokerSupport.getConnectionContext(broker.getContextBroker()), new ActiveMQQueue(name),true);
250 }
251
252 public void removeTopic(String name) throws Exception {
253 broker.getContextBroker().removeDestination(BrokerSupport.getConnectionContext(broker.getContextBroker()), new ActiveMQTopic(name),
254 1000);
255 }
256
257 public void removeQueue(String name) throws Exception {
258 broker.getContextBroker().removeDestination(BrokerSupport.getConnectionContext(broker.getContextBroker()), new ActiveMQQueue(name),
259 1000);
260 }
261
262 public ObjectName createDurableSubscriber(String clientId, String subscriberName, String topicName,
263 String selector) throws Exception {
264 ConnectionContext context = new ConnectionContext();
265 context.setBroker(broker);
266 context.setClientId(clientId);
267 ConsumerInfo info = new ConsumerInfo();
268 ConsumerId consumerId = new ConsumerId();
269 consumerId.setConnectionId(clientId);
270 consumerId.setSessionId(sessionIdCounter.incrementAndGet());
271 consumerId.setValue(0);
272 info.setConsumerId(consumerId);
273 info.setDestination(new ActiveMQTopic(topicName));
274 info.setSubscriptionName(subscriberName);
275 info.setSelector(selector);
276 Subscription subscription = broker.addConsumer(context, info);
277 broker.removeConsumer(context, info);
278 if (subscription != null) {
279 return subscription.getObjectName();
280 }
281 return null;
282 }
283
284 public void destroyDurableSubscriber(String clientId, String subscriberName) throws Exception {
285 RemoveSubscriptionInfo info = new RemoveSubscriptionInfo();
286 info.setClientId(clientId);
287 info.setSubscriptionName(subscriberName);
288 ConnectionContext context = new ConnectionContext();
289 context.setBroker(broker);
290 context.setClientId(clientId);
291 broker.removeSubscription(context, info);
292 }
293
294 // doc comment inherited from BrokerViewMBean
295 public void reloadLog4jProperties() throws Throwable {
296
297 // Avoid a direct dependency on log4j.. use reflection.
298 try {
299 ClassLoader cl = getClass().getClassLoader();
300 Class logManagerClass = cl.loadClass("org.apache.log4j.LogManager");
301
302 Method resetConfiguration = logManagerClass.getMethod("resetConfiguration", new Class[]{});
303 resetConfiguration.invoke(null, new Object[]{});
304
305 URL log4jprops = cl.getResource("log4j.properties");
306 if (log4jprops != null) {
307 Class propertyConfiguratorClass = cl.loadClass("org.apache.log4j.PropertyConfigurator");
308 Method configure = propertyConfiguratorClass.getMethod("configure", new Class[]{URL.class});
309 configure.invoke(null, new Object[]{log4jprops});
310 }
311 } catch (InvocationTargetException e) {
312 throw e.getTargetException();
313 }
314 }
315
316
317 public String getOpenWireURL() {
318 String answer = brokerService.getTransportConnectorURIsAsMap().get("tcp");
319 return answer != null ? answer : "";
320 }
321
322 public String getStompURL() {
323 String answer = brokerService.getTransportConnectorURIsAsMap().get("stomp");
324 return answer != null ? answer : "";
325 }
326
327 public String getSslURL() {
328 String answer = brokerService.getTransportConnectorURIsAsMap().get("ssl");
329 return answer != null ? answer : "";
330 }
331
332 public String getStompSslURL() {
333 String answer = brokerService.getTransportConnectorURIsAsMap().get("stomp+ssl");
334 return answer != null ? answer : "";
335 }
336
337 public String getVMURL() {
338 URI answer = brokerService.getVmConnectorURI();
339 return answer != null ? answer.toString() : "";
340 }
341
342 public String getDataDirectory() {
343 File file = brokerService.getDataDirectoryFile();
344 try {
345 return file != null ? file.getCanonicalPath():"";
346 } catch (IOException e) {
347 return "";
348 }
349 }
350
351 public ObjectName getJMSJobScheduler() {
352 return this.jmsJobScheduler;
353 }
354
355 public void setJMSJobScheduler(ObjectName name) {
356 this.jmsJobScheduler=name;
357 }
358 }