KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > continuent > sequoia > controller > jmx > MBeanServerManager


1 /**
2  * Sequoia: Database clustering technology.
3  * Copyright (C) 2002-2004 French National Institute For Research In Computer
4  * Science And Control (INRIA).
5  * Copyright (C) 2006 Continuent, Inc.
6  * Contact: sequoia@continuent.org
7  *
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  * http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  *
20  * Initial developer(s): Marc Wick.
21  * Contributor(s): Peter Royal, Emmanuel Cecchet
22  */

23
24 package org.continuent.sequoia.controller.jmx;
25
26 import javax.management.MBeanServer JavaDoc;
27 import javax.management.MBeanServerFactory JavaDoc;
28 import javax.management.ObjectInstance JavaDoc;
29 import javax.management.ObjectName JavaDoc;
30
31 import org.continuent.sequoia.common.i18n.Translate;
32 import org.continuent.sequoia.common.jmx.JmxException;
33 import org.continuent.sequoia.common.log.Trace;
34
35 /**
36  * The MBeanServerManager (Singleton) creates a single MBeanServer in an JVM.
37  * The server can be accessed with the getInstance() method.
38  * <p>
39  * The server is created with
40  * org.continuent.sequoia.controller.jmx.MBeanServerBuilder
41  *
42  * @author <a HREF="mailto:marc.wick@monte-bre.ch">Marc Wick </a>
43  * @version 1.0
44  */

45 public class MBeanServerManager
46 {
47   private static MBeanServer JavaDoc mbs;
48
49   static Trace logger = Trace
50                                         .getLogger("org.continuent.sequoia.controller.jmx.MBeanServer");
51
52   /**
53    * creating a MBeanServer, if it does not exist, otherwise a reference to the
54    * MBeanServer is returned
55    *
56    * @return the mbeanserver instance, null if jmx is disabled
57    */

58   public static synchronized MBeanServer JavaDoc getInstance()
59   {
60     if (mbs != null)
61     {
62       return mbs;
63     }
64
65     String JavaDoc defaultServerBuilder = System
66         .getProperty("javax.management.builder.initial");
67
68     if (!MBeanServerBuilder.class.getName().equals(defaultServerBuilder))
69     {
70       if (defaultServerBuilder != null)
71         logger.error("property javax.management.builder.initial was "
72             + defaultServerBuilder);
73
74       logger.debug("setting property javax.management.builder.initial");
75       System.setProperty("javax.management.builder.initial",
76           org.continuent.sequoia.controller.jmx.MBeanServerBuilder.class
77               .getName());
78
79     }
80
81     // try to use the MBeanServer provided by Java 5
82
createJava5PlatformMBeanServer();
83     // otherwise rely on the classpath to create the MBeanServer
84
if (null == mbs)
85     {
86       mbs = MBeanServerFactory.createMBeanServer();
87       logger.debug(Translate.get("jmx.server.from.classpath")); //$NON-NLS-1$
88
}
89
90     return mbs;
91   }
92
93   /**
94    * Retrieve the MBeanServer provided by Java 5. This is done by reflection to
95    * avoid creating hard-coded dependencies to Java 5-only classes.
96    */

97   private static void createJava5PlatformMBeanServer()
98   {
99     Class JavaDoc clazz;
100     try
101     {
102       clazz = Class.forName("java.lang.management.ManagementFactory"); //$NON-NLS-1$
103
}
104     catch (ClassNotFoundException JavaDoc e)
105     {
106       // Java 5-only class is not available: do nothing
107
return;
108     }
109     try
110     {
111       mbs = (MBeanServer JavaDoc) clazz
112           .getMethod("getPlatformMBeanServer", null).invoke(null, null); //$NON-NLS-1$
113
logger.debug(Translate.get("jmx.server.from.java5")); //$NON-NLS-1$
114
}
115     catch (Exception JavaDoc e)
116     {
117       logger.debug(Translate.get("jmx.server.not.java5"), e); //$NON-NLS-1$
118
}
119   }
120
121   /**
122    * Stop the MBean server
123    */

124   public static void stopMBeanServer()
125   {
126     if (mbs != null)
127     {
128       // Stop mbean server
129
MBeanServerFactory.releaseMBeanServer(mbs);
130       mbs = null;
131     }
132   }
133
134   /**
135    * Registers an MBean with the MBean server if jmx is enabled, otherwise it
136    * returns null.
137    * <p>
138    * This method is equivalend to
139    *
140    * <pre>
141    * MBeanServer server = MBeanServerManager.getInstance();
142    * if (server != null)
143    * {
144    * server.registerMBean(object, name);
145    * }
146    * </pre>
147    *
148    * @param object The MBean to be registered as an MBean.
149    * @param name The object name of the MBean. May be null.
150    * @return An ObjectInstance, containing the ObjectName and the Java class
151    * name of the newly registered MBean. If the contained ObjectName is
152    * n, the contained Java class name is getMBeanInfo(n).getClassName().
153    * Or null if jmx is disabled
154    * @throws JmxException the object could not be registered
155    */

156   public static ObjectInstance JavaDoc registerMBean(Object JavaDoc object, ObjectName JavaDoc name)
157       throws JmxException
158   {
159     MBeanServer JavaDoc server = getInstance();
160     try
161     {
162
163       if (server != null)
164       {
165         logger.debug(Translate.get("jmx.register.mbean", new String JavaDoc[]{
166             object.getClass().toString(), name.getCanonicalName()}));
167
168         ObjectInstance JavaDoc objInstance = null;
169         if (!server.isRegistered(name))
170         {
171           objInstance = server.registerMBean(object, name);
172         }
173         else
174         {
175           logger.error(Translate.get("jmx.register.mbean.already.exist",
176               new String JavaDoc[]{name.getCanonicalName()}));
177           try
178           {
179             server.unregisterMBean(name);
180           }
181           catch (Exception JavaDoc e)
182           {
183             logger.error(Translate.get("jmx.delete.mbean.failed", new String JavaDoc[]{
184                 name.toString(), e.getMessage()}));
185           }
186           objInstance = server.registerMBean(object, name);
187         }
188
189         logger.debug(Translate.get("jmx.server.mbean.count", ""
190             + server.getMBeanCount()));
191         return objInstance;
192       }
193       return null;
194     }
195     catch (Exception JavaDoc e)
196     {
197       logger.error(Translate.get("jmx.register.mbean.failed",
198           new String JavaDoc[]{object.getClass().toString(), e.getMessage(),
199               e.getClass().toString()}));
200       e.printStackTrace();
201       e.getCause().printStackTrace();
202       throw new JmxException(e);
203     }
204   }
205
206   /**
207    * unregister an mbean.
208    *
209    * @param name the name of the bean to unregister
210    * @throws JmxException problems
211    */

212   public static void unregister(ObjectName JavaDoc name) throws JmxException
213   {
214     MBeanServer JavaDoc server = getInstance();
215     if (server != null)
216     {
217       try
218       {
219         // unregister the MBean
220
server.unregisterMBean(name);
221         logger.debug(Translate.get("jmx.server.mbean.count", ""
222             + server.getMBeanCount()));
223
224       }
225       catch (Exception JavaDoc e)
226       {
227         logger.error(Translate.get("jmx.register.mbean.failed", new String JavaDoc[]{
228             name.getCanonicalName(), e.getMessage()}));
229         throw new JmxException(e);
230       }
231     }
232   }
233
234 }
Popular Tags