KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > jmanage > testapp > jsr160 > JMXHelper


1 /**
2  * Copyright 2004-2005 jManage.org
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */

16 package org.jmanage.testapp.jsr160;
17
18 import org.jmanage.core.util.Loggers;
19 import org.jmanage.testapp.mbeans.*;
20
21 import javax.management.MBeanServer JavaDoc;
22 import javax.management.ObjectName JavaDoc;
23 import javax.management.MBeanServerFactory JavaDoc;
24 import javax.management.openmbean.OpenDataException JavaDoc;
25 import javax.management.remote.JMXServiceURL JavaDoc;
26 import javax.management.remote.JMXConnectorServer JavaDoc;
27 import javax.management.remote.JMXConnectorServerFactory JavaDoc;
28 import javax.management.remote.JMXAuthenticator JavaDoc;
29 import javax.security.auth.Subject JavaDoc;
30 import java.util.logging.Logger JavaDoc;
31 import java.util.logging.Level JavaDoc;
32 import java.util.HashMap JavaDoc;
33 import java.util.Map JavaDoc;
34 import java.io.IOException JavaDoc;
35 import java.rmi.registry.LocateRegistry JavaDoc;
36
37 /**
38  *
39  * date: Dec 19, 2004
40  * @author Rakesh Kalra
41  */

42 public class JMXHelper {
43
44     private static final Logger JavaDoc logger = Loggers.getLogger(JMXHelper.class);
45
46     // the mbeanServer used by the application
47
private static MBeanServer JavaDoc mbeanServer;
48
49     // the lock used to obtain the first mbeanServer
50
private static Object JavaDoc mbeanServerLock = new Object JavaDoc();
51
52     /**
53      * Obtains a reference to the MBean server. If at least one
54      * MBean server already exists, then a reference to that MBean
55      * server is returned. Otherwise a new instance is created.
56      */

57     private static MBeanServer JavaDoc getMBeanServer() {
58
59         if (mbeanServer == null) {
60             mbeanServer = _getMBeanServer();
61         }
62         return mbeanServer;
63     }
64
65     /**
66      * registers the MBeans used in the application
67      * and starts the HTML Adaptor
68      */

69     public static void registerMBeans(int port, boolean jmxmpConnector) {
70
71         /* Configuration */
72         registerMBean(new Configuration(), ObjectNames.CONFIGURATION);
73         /* Calculator */
74         registerMBean(new Calculator(), ObjectNames.CALCULATOR);
75         /* PrimitiveDataTypeTest */
76         registerMBean(new PrimitiveDataTypeTest(),
77                 ObjectNames.PRIMITIVE_DATA_TYPE_TEST);
78         /* DataTypeTest */
79         registerMBean(new DataTypeTest(), ObjectNames.DATA_TYPE_TEST);
80         /* BigDataTypeTest */
81         registerMBean(new BigDataTypeTest(), ObjectNames.BIG_DATA_TYPE_TEST);
82         /* BigDataTypeTest */
83         registerMBean(new ObjectNameDataTypeTest(),
84                 ObjectNames.OBJECT_NAME_DATA_TYPE_TEST);
85          /* TimeNotificationBroadcaster */
86         registerMBean(new TimeNotificationBroadcaster(),
87                 ObjectNames.TIME_NOTIFICATION_BROADCASTER);
88         /* Data Formatter */
89         registerMBean(new DataFormat(),
90                 ObjectNames.DATA_FORMAT);
91         /* OpenMBeanDataTypeTest */
92         try {
93             registerMBean(new OpenMBeanDataTypeTest(),
94                     ObjectNames.OPEN_MBEAN_DATA_TYPE_TEST);
95         } catch (OpenDataException JavaDoc e) {
96             throw new RuntimeException JavaDoc(e);
97         }
98
99         if(!jmxmpConnector){
100             /* start RMI connector */
101             startJMXConnectorServer(port);
102         }else{
103             /* start the JMXMP Connector */
104             startJMXMPConnectorServer(port);
105         }
106     }
107
108
109     public static void registerMBean(Object JavaDoc instance, String JavaDoc objName) {
110         try {
111             ObjectName JavaDoc objectName = new ObjectName JavaDoc(objName);
112             MBeanServer JavaDoc server = getMBeanServer();
113             server.registerMBean(instance, objectName);
114             logger.info("registered MBean: " + objName);
115         } catch (Exception JavaDoc e) {
116             logger.log(Level.SEVERE, "Failed to register MBean: " + objName, e);
117         }
118     }
119
120     /* start JSR160 RMI connector*/
121     private static void startJMXConnectorServer(int port){
122         try {
123             /* attempt to start the rmi registry */
124             startRMIRegistry(port);
125             /* start the connector server */
126             JMXServiceURL JavaDoc url = new JMXServiceURL JavaDoc(
127               "service:jmx:rmi:///jndi/rmi://localhost:" + port + "/testApp");
128             Map JavaDoc env = new HashMap JavaDoc();
129             JMXAuthenticator JavaDoc authenticator = new MyJMXAuthenticator();
130             env.put(JMXConnectorServer.AUTHENTICATOR, authenticator);
131             JMXConnectorServer JavaDoc cs =
132                  JMXConnectorServerFactory.newJMXConnectorServer(url,
133                  env, getMBeanServer());
134             cs.start();
135             logger.info("JMXConnectorServer started. URL: " + url.toString());
136         } catch (IOException JavaDoc e) {
137             logger.log(Level.SEVERE, "Failure while starting RMI connector", e);
138         }
139     }
140
141     private static class MyJMXAuthenticator implements JMXAuthenticator JavaDoc{
142         public Subject JavaDoc authenticate(Object JavaDoc credentials) {
143             System.out.println(credentials);
144             return null;
145         }
146     }
147
148     /* start JSR160 JMXMP connector*/
149     private static void startJMXMPConnectorServer(int port){
150         try {
151             /* start the connector server */
152             JMXServiceURL JavaDoc url = new JMXServiceURL JavaDoc(
153               "service:jmx:jmxmp://localhost:" + port);
154             Map JavaDoc env = new HashMap JavaDoc();
155             JMXAuthenticator JavaDoc authenticator = new MyJMXAuthenticator();
156             env.put(JMXConnectorServer.AUTHENTICATOR, authenticator);
157             JMXConnectorServer JavaDoc cs =
158                  JMXConnectorServerFactory.newJMXConnectorServer(url,
159                  env, getMBeanServer());
160             cs.start();
161             logger.info("JMXConnectorServer started. URL: " + url.toString());
162         } catch (IOException JavaDoc e) {
163             logger.log(Level.SEVERE, "Failure while starting RMI connector", e);
164         }
165     }
166
167     /* start rmi registry */
168     private static void startRMIRegistry(int port){
169         try {
170             LocateRegistry.createRegistry(port);
171             logger.info("rmiregistry started on: " + port);
172         } catch (IOException JavaDoc e) {
173             logger.log(Level.WARNING, "Error starting rmiregistry on " + port, e);
174         }
175     }
176
177
178     ////////////////////////////////////////////////////////////////////////////
179
// Helper Methods
180

181     /**
182      * look up or create a MBeanServer
183      * @return instance of MBeanServer
184      */

185     private static MBeanServer JavaDoc _getMBeanServer() {
186
187         // synchronize to make sure that we don't create multiple MBeanServers
188
synchronized (mbeanServerLock) {
189             // if we got the instance in the mean time, just return it
190
if (mbeanServer != null)
191                 return mbeanServer;
192             return MBeanServerFactory.createMBeanServer();
193         }
194     }
195 }
196
Popular Tags