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.transport;
018
019 import java.lang.ref.WeakReference;
020 import java.util.Collections;
021 import java.util.HashSet;
022 import java.util.Set;
023
024 import javax.management.ObjectName;
025
026 import org.apache.activemq.broker.jmx.AnnotatedMBean;
027 import org.apache.activemq.broker.jmx.ManagementContext;
028 import org.apache.activemq.util.JMXSupport;
029 import org.slf4j.Logger;
030 import org.slf4j.LoggerFactory;
031
032 /**
033 * Class implementing the TransportLoggerViewMBean interface.
034 * When an object of this class is created, it registers itself in
035 * the MBeanServer of the management context provided.
036 * When a TransportLogger object is finalized because the Transport Stack
037 * where it resides is no longer in use, the method unregister() will be called.
038 *
039 * @author David Martin Clavo david(dot)martin(dot)clavo(at)gmail.com
040 *
041 * @see TransportLoggerViewMBean.
042 */
043 public class TransportLoggerView implements TransportLoggerViewMBean {
044
045 private static final Logger log = LoggerFactory.getLogger(TransportLoggerView.class);
046
047 /**
048 * Set with the TransportLoggerViews objects created.
049 * Used by the methods enableAllTransportLoggers and diablellTransportLoggers.
050 * The method unregister() removes objects from this set.
051 */
052 private static Set<TransportLoggerView> transportLoggerViews = Collections.synchronizedSet(new HashSet<TransportLoggerView>());
053
054 private final WeakReference<TransportLogger> transportLogger;
055 private final String nextTransportName;
056 private final int id;
057 private final ManagementContext managementContext;
058 private final ObjectName name;
059
060 /**
061 * Constructor.
062 * @param transportLogger The TransportLogger object which is to be managed by this MBean.
063 * @param nextTransportName The name of the next TransportLayer. This is used to give a unique
064 * name for each MBean of the TransportLoggerView class.
065 * @param id The id of the TransportLogger to be watched.
066 * @param managementContext The management context who has the MBeanServer where this MBean will be registered.
067 */
068 public TransportLoggerView (TransportLogger transportLogger, String nextTransportName, int id, ManagementContext managementContext) {
069 this.transportLogger = new WeakReference<TransportLogger>(transportLogger);
070 this.nextTransportName = nextTransportName;
071 this.id = id;
072 this.managementContext = managementContext;
073 this.name = this.createTransportLoggerObjectName();
074
075 TransportLoggerView.transportLoggerViews.add(this);
076 this.register();
077 }
078
079 /**
080 * Enable logging for all Transport Loggers at once.
081 */
082 public static void enableAllTransportLoggers() {
083 for (TransportLoggerView view : transportLoggerViews) {
084 view.enableLogging();
085 }
086 }
087
088 /**
089 * Disable logging for all Transport Loggers at once.
090 */
091 public static void disableAllTransportLoggers() {
092 for (TransportLoggerView view : transportLoggerViews) {
093 view.disableLogging();
094 }
095 }
096
097 // doc comment inherited from TransportLoggerViewMBean
098 public void enableLogging() {
099 this.setLogging(true);
100 }
101
102 // doc comment inherited from TransportLoggerViewMBean
103 public void disableLogging() {
104 this.setLogging(false);
105 }
106
107 // doc comment inherited from TransportLoggerViewMBean
108 public boolean isLogging() {
109 return transportLogger.get().isLogging();
110 }
111
112 // doc comment inherited from TransportLoggerViewMBean
113 public void setLogging(boolean logging) {
114 transportLogger.get().setLogging(logging);
115 }
116
117 /**
118 * Registers this MBean in the MBeanServer of the management context
119 * provided at creation time. This method is only called by the constructor.
120 */
121 private void register() {
122 try {
123 AnnotatedMBean.registerMBean(this.managementContext, this, this.name);
124 } catch (Exception e) {
125 log.error("Could not register MBean for TransportLoggerView " + id + "with name " + this.name.toString() + ", reason: " + e, e);
126 }
127
128 }
129
130 /**
131 * Unregisters the MBean from the MBeanServer of the management context
132 * provided at creation time.
133 * This method is called by the TransportLogger object being managed when
134 * the TransportLogger object is finalized, to avoid the memory leak that
135 * would be caused if MBeans were not unregistered.
136 */
137 public void unregister() {
138
139 TransportLoggerView.transportLoggerViews.remove(this);
140
141 try {
142 this.managementContext.unregisterMBean(this.name);
143 } catch (Exception e) {
144 log.error("Could not unregister MBean for TransportLoggerView " + id + "with name " + this.name.toString() + ", reason: " + e, e);
145 }
146 }
147
148 /**
149 * Creates the ObjectName to be used when registering the MBean.
150 * @return the ObjectName to be used when registering the MBean.
151 */
152 private ObjectName createTransportLoggerObjectName() {
153 try {
154 return new ObjectName(
155 createTransportLoggerObjectNameRoot(this.managementContext)
156 + JMXSupport.encodeObjectNamePart(TransportLogger.class.getSimpleName()
157 + " " + this.id + ";" + this.nextTransportName));
158 } catch (Exception e) {
159 log.error("Could not create ObjectName for TransportLoggerView " + id + ", reason: " + e, e);
160 return null;
161 }
162 }
163
164 /**
165 * Creates the part of the ObjectName that will be used by all MBeans.
166 * This method is public so it can be used by the TransportLoggerControl class.
167 * @param managementContext
168 * @return A String with the part of the ObjectName common to all the TransportLoggerView MBeans.
169 */
170 public static String createTransportLoggerObjectNameRoot(ManagementContext managementContext) {
171 return managementContext.getJmxDomainName()+":"+"Type=TransportLogger,"+"TransportLoggerName=";
172 }
173
174 }