JBoss.org Community Documentation
Let's start with a simple XMBean variation of the standard MBean version of the JNDIMap that adds the descriptive information about the attributes and operations and their arguments. The following listing shows the jboss-service.xml
descriptor and the jndimap-xmbean1.xml
XMBean descriptor. The source can be found in the src/main/org/jboss/book/jmx/xmbean
directory of the book examples.
<?xml version='1.0' encoding='UTF-8' ?> <!DOCTYPE server PUBLIC "-//JBoss//DTD MBean Service 3.2//EN" "http://www.jboss.org/j2ee/dtd/jboss-service_3_2.dtd"> <server> <mbean code="org.jboss.book.jmx.xmbean.JNDIMap" name="j2eechap2.xmbean:service=JNDIMap" xmbean-dd="META-INF/jndimap-xmbean.xml"> <attribute name="JndiName">inmemory/maps/MapTest</attribute> <depends>jboss:service=Naming</depends> </mbean> </server>
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mbean PUBLIC "-//JBoss//DTD JBOSS XMBEAN 1.0//EN" "http://www.jboss.org/j2ee/dtd/jboss_xmbean_1_0.dtd"> <mbean> <description>The JNDIMap XMBean Example Version 1</description> <descriptors> <persistence persistPolicy="Never" persistPeriod="10" persistLocation="data/JNDIMap.data" persistName="JNDIMap"/> <currencyTimeLimit value="10"/> <state-action-on-update value="keep-running"/> </descriptors> <class>org.jboss.test.jmx.xmbean.JNDIMap</class> <constructor> <description>The default constructor</description> <name>JNDIMap</name> </constructor> <!-- Attributes --> <attribute access="read-write" getMethod="getJndiName" setMethod="setJndiName"> <description> The location in JNDI where the Map we manage will be bound </description> <name>JndiName</name> <type>java.lang.String</type> <descriptors> <default value="inmemory/maps/MapTest"/> </descriptors> </attribute> <attribute access="read-write" getMethod="getInitialValues" setMethod="setInitialValues"> <description>The array of initial values that will be placed into the map associated with the service. The array is a collection of key,value pairs with elements[0,2,4,...2n] being the keys and elements [1,3,5,...,2n+1] the associated values. The "[Ljava.lang.String;" type signature is the VM representation of the java.lang.String[] type. </description> <name>InitialValues</name> <type>[Ljava.lang.String;</type> <descriptors> <default value="key0,value0"/> </descriptors> </attribute> <!-- Operations --> <operation> <description>The start lifecycle operation</description> <name>start</name> </operation> <operation> <description>The stop lifecycle operation</description> <name>stop</name> </operation> <operation impact="ACTION"> <description>Put a value into the map</description> <name>put</name> <parameter> <description>The key the value will be store under</description> <name>key</name> <type>java.lang.Object</type> </parameter> <parameter> <description>The value to place into the map</description> <name>value</name> <type>java.lang.Object</type> </parameter> </operation> <operation impact="INFO"> <description>Get a value from the map</description> <name>get</name> <parameter> <description>The key to lookup in the map</description> <name>get</name> <type>java.lang.Object</type> </parameter> <return-type>java.lang.Object</return-type> </operation> <!-- Notifications --> <notification> <description>The notification sent whenever a value is get into the map managed by the service</description> <name>javax.management.Notification</name> <notification-type>org.jboss.book.jmx.xmbean.JNDIMap.get</notification-type> </notification> <notification> <description>The notification sent whenever a value is put into the map managed by the service</description> <name>javax.management.Notification</name> <notification-type>org.jboss.book.jmx.xmbean.JNDIMap.put</notification-type> </notification> </mbean>
You can build, deploy and test the XMBean as follows:
[examples]$ ant -Dchap=jmx -Dex=xmbean1 run-example ... run-examplexmbean1: [java] JNDIMap Class: org.jboss.mx.modelmbean.XMBean [java] JNDIMap Operations: [java] + void start() [java] + void stop() [java] + void put(java.lang.Object chap2.xmbean:service=JNDIMap,java.lang.Object chap2.xmbean:service=JNDIMap) [java] + java.lang.Object get(java.lang.Object chap2.xmbean:service=JNDIMap) [java] name=chap2.xmbean:service=JNDIMap [java] listener=org.jboss.book.jmx.xmbean.TestXMBean1$Listener@f38cf0 [java] key=key0, value=value0 [java] handleNotification, event: javax.management.Notification[source=chap2.xmbean: service=JNDIMap][type=org.jboss.book.jmx.xmbean.JNDIMap.put][message=] [java] JNDIMap.put(key1, value1) successful [java] handleNotification, event: javax.management.Notification[source=chap2.xmbean: service=JNDIMap][type=org.jboss.book.jmx.xmbean.JNDIMap.get][message=] [java] JNDIMap.get(key0): null [java] handleNotification, event: javax.management.Notification[source=chap2.xmbean: service=JNDIMap][type=org.jboss.book.jmx.xmbean.JNDIMap.get][message=] [java] JNDIMap.get(key1): value1 [java] handleNotification, event: javax.management.Notification[source=chap2.xmbean: service=JNDIMap][type=org.jboss.book.jmx.xmbean.JNDIMap.put][message=] [java] handleNotification, event: javax.management.AttributeChangeNotification[source =chap2.xmbean:service=JNDIMap][type=jmx.attribute.change][message=InitialValues changed from javax.management.Attribute@82a72a to javax.management.Attribute@acdb96]
The functionality is largely the same as the Standard MBean with the notable exception of the JMX notifications. A Standard MBean has no way of declaring that it will emit notifications. An XMBean may declare the notifications it emits using notification elements as is shown in the version 1 descriptor. We see the notifications from the get and put operations on the test client console output. Note that there is also an jmx.attribute.change notification
emitted when the InitialValues
attribute was changed. This is because the ModelMBean
interface extends the ModelMBeanNotificationBroadcaster
which supports AttributeChangeNotificationListeners
.
The other major difference between the Standard and XMBean versions of JNDIMap is the descriptive metadata. Look at the chap2.xmbean:service=JNDIMap
in the JMX Console, and you will see the attributes section as shown in Figure 3.18, “The Version 1 JNDIMapXMBean jmx-console view”.
Notice that the JMX Console now displays the full attribute description as specified in the XMBean descriptor rather than MBean Attribute
text seen in standard MBean implementations. Scroll down to the operations and you will also see that these now also have nice descriptions of their function and parameters.