123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198 |
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
- <!-- package.html - describes classes in javax.management package.
- Copyright (C) 2007 Free Software Foundation, Inc.
- This file is part of GNU Classpath.
- GNU Classpath is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your option)
- any later version.
- GNU Classpath is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with GNU Classpath; see the file COPYING. If not, write to the
- Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- 02110-1301 USA.
- Linking this library statically or dynamically with other modules is
- making a combined work based on this library. Thus, the terms and
- conditions of the GNU General Public License cover the whole
- combination.
- As a special exception, the copyright holders of this library give you
- permission to link this library with independent modules to produce an
- executable, regardless of the license terms of these independent
- modules, and to copy and distribute the resulting executable under
- terms of your choice, provided that you also meet, for each linked
- independent module, the terms and conditions of the license of that
- module. An independent module is a module which is not derived from
- or based on this library. If you modify this library, you may extend
- this exception to your version of the library, but you are not
- obligated to do so. If you do not wish to do so, delete this
- exception statement from your version. -->
- <html>
- <head><title>GNU Classpath - javax.management</title></head>
- <body>
- <p>
- Provides the core classes for the Java Management Extensions (JMX). This API
- builds on the notion of Java beans by providing a layer of abstraction between
- the beans themselves and the method of accessing them. Instead of being accessed
- directly, management beans or <strong>MBeans</strong> are usually accessed via
- a management server (an implementation of the @see MBeanServer interface). Thus,
- the bean itself may be a simple Java object or it may be something
- more complicated (for example, the server may map from Java to SNMP). The server may
- also retrieve the bean from some remote location rather than using a local object.
- </p>
- <p>
- Management beans are usually used for monitoring and/or configuration
- of a particular entity. For example, the platform management beans
- found in the @see java.lang.management package allow the user
- to obtain information about the operating system, current memory usage, etc.
- as well as turning on and off certain additional facilities. To this end,
- an MBean consists of:
- </p>
- <ul>
- <li><emph>attributes</emph> that may be read and/or written to.</li>
- <li><emph>operations</emph> which may be performed.</li>
- <li><emph>notifications</emph> that may emitted by the bean and listened for by users.</li>
- </ul>
- <p>
- The most common type of management bean is the @see StandardMBean, A standard MBean
- relies on the naming patterns established by the JavaBeans framework; the value of an
- attribute <code>name</code> is retrieved by an accessor method named <code>getName</code>
- and changed by a mutator method called <code>setName</code>. If the mutator is absent,
- the attribute is read only. Naming is also used to associate the implementation of a
- bean with its interface; an bean <code>Person</code> is assumed to be an implementation
- of the interface <code>PersonMBean</code> (and vice versa). To avoid these naming constraints,
- the @see StandardMBean class may be used.
- </p>
- <p>
- <h2>Types of Beans</h2>
- <p>
- The @see StandardMBean class is one example of a @see DynamicMBean where the attributes and
- operations of the bean are provided dynamically via the methods provided. With the
- @see StandardMBean class, this simply means that the class uses reflection to access the
- appropriate methods of the bean implementation. In a more complex scenario, the bean's
- data could be supplied from a file or over the network.
- </p>
- <p>
- Once we start talking about accessing beans over network and platform boundaries, we run
- in to the issue of how to deal with the types utilised by these beans. Simple types, such
- as numbers and strings, are usually fine but more complex types need special treatment.
- An <emph>Open MBean</emph> is one that only uses a specific set of types defined in the
- @see javax.management.openmbean package, allowing both sides of a remote connection to provide
- this subset of types and thus interact. An @see MXBean goes a stage further, and defines
- a method whereby a normal Java MBean may become an Open MBean by performing a defined mapping
- on the types of the bean. For example, a @see java.util.List or @see java.util.Set of a
- particular type becomes an array of the same type.
- </p>
- <h2>Accessing Beans</h2>
- <p>
- Although beans can be accessed like normal objects, the normal way of accessing them is
- via an @see MBeanServer. This provides the abstraction from the bean's implementation to
- a set of attributes, operations and notifications. The server identifies each bean via
- an @see ObjectName. This name is unique to a particular bean and is used to identify the
- bean when retrieving the value of an attribute or invoking an operation. Essentially, most
- methods provided by the server are the same as those provided by the @see DynamicMBean
- interface, except that each takes this additional @link ObjectName parameter to identify the
- bean being accessed.
- </p>
- <p>
- The @see MBeanServerFactory keeps track of the current MBean servers in use and allows new
- ones to be created. A special @see MBeanServer instance, called the <emph>platform MBean
- server</emph>, is created when the Java virtual machine is started and a reference to this
- may be obtained from the @see ManagementFactory using
- @see ManagementFactory#getPlatformMBeanServer(). This primarily exists for the purpose of
- creating and registering the platform MBeans, described in @see java.lang.management, which
- provide access to information about the underlying operating system, memory usage, the behaviour
- of the garbage collector, etc. but is equally suitable for creating and registering your own
- beans. Alternatively, a server instance may be obtained from the @see MBeanServerFactory.
- </p>
- <p>
- A bean obtains an @link ObjectName by registering with the server. This operation can be
- performed either by passing an existing instance to the @see MBeanServer#registerMBean method
- or by using the @see MBeanServer#createMBean method to simultaneously create the bean and
- register it with the server. During the registration process, the bean may perform some
- arbitrary behaviour if it implements the @link MBeanRegistration interface. The same is
- true when unregistering a bean.
- </p>
- <p>
- To actually access the attributes and operations of a bean via the server, we use code
- like the following:
- </p>
- <pre>
- // First we obtain the platform MBean server which has the platform MBeans registered
- MBeanServer server = ManagementFactory.getPlatformMBeanServer();
- // We also need the object name of the memory bean so we can address it
- ObjectName name = new ObjectName(ManagementFactory.MEMORY_MXBEAN_NAME);
- // Next we obtain the value of the 'verbose' attribute
- // What actually happens here is that the server invokes the 'isVerbose' method of
- // the MemoryMXBean
- boolean verbose = server.getAttribute(name, "verbose");
- // We can also set the value of verbose. Again the server is actually performing
- // a setVerbose(val) on the bean but we don't need to know this.
- Attribute attrib = new Attribute("verbose", true);
- server.setAttribute(name, attrib);
- // We can also invoke the 'gc' operation which calls the garbage collector.
- server.invoke(name, "gc", new Object[]{}, new String[]{});
- </pre>
- <p>
- As noted above, the server is simply making basic method calls on the object using
- reflection. However, the server provides a layer of abstraction which means that something
- more complicated could actually be going on. The lines above are equally applicable, for
- example, if <code>server</code> is instead an @see MBeanServerConnection connecting us
- to a distant computer.
- </p>
- <p>
- This rather hideous code can be simplified back into simple method calls on an object,
- so that we get the best of both worlds. This is achieved using a <emph>MBean proxy</emph>:
- <pre>
- MBeanServer server = ManagementFactory.getPlatformMBeanServer();
- ObjectName name = new ObjectName(ManagementFactory.MEMORY_MXBEAN_NAME);
- MemoryMXBean bean = JMX.newMBeanProxy(server, name, MemoryMXBean.class);
- boolean verbose = bean.isVerbose();
- bean.setVerbose(true);
- bean.gc();
- </pre>
- <p>
- See how much simpler the operations are? The proxy handles the task of translating the method
- calls into appropriate invocations of methods on the server, simplifying the code for the user.
- </p>
- <p>
- Finally, we have assumed in the code above that the @see ObjectName of the bean is known.
- If this is not the case, then the server's database can be searched. The @see Query class
- provides appropriate operators (e.g. boolean (and,or), value comparison (>, <)) for
- building up relatively complex queries. Once constructed, a query may be passed to either
- the @see MBeanServer#queryNames or @see MBeanServer#queryMBeans to obtain an appropriate
- set of @see ObjectName or MBean instances.
- </p>
- <h2>Notifications</h2>
- <p>
- MBeans also have the capability to emit events. Beans which do so implement either the
- @see NotificationBroadcaster or @see NotificationEmitter interface (the difference between
- the two is simply the existence of a better removal method in the newer
- @see NotificationEmitter interface, which otherwise extends @see NotificationBroadcaster),
- usually by extending the @see NotificationBroadcasterSupport class. As is usual with event
- handling, other classes may <emph>signup</emph> to receive events via the
- @see NotificationListener interface. The signup process can include registering a filter
- (an implementation of @see NotificationFilter) so that only certain events reach the
- listener and others are discarded.
- </p>
- <h2>Remote Access</h2>
- <p>
- The subpackage @see javax.management.remote provides facilities to access remote MBean
- servers. This consists of a <emph>connector</emph> framework which abstracts the method
- of accessing remote servers from the actual implementation, so that the same method is
- used to connect to a remote server, regardless of how it is accessed.
- </p>
- </body>
- </html>
|