Im Javamagazin 01.2005 beschreibt der Artikel 'JMX: Überwachung von E-Business-Lösungen' die Erzeugung von JMX ModelMBeans mit Hilfe der Apache Jakarta Commons Modeler Component. Leider orientiert sich der Artikel an der inzwischen stark veralteten Version 1.0 dieser API. In den Beipielcodes werden Methoden und Vorgehensweisen beschrieben, die seit der Version 1.1 als deprecated markiert sind.
Auch ist der Beispielcode auf Seite 21 sehr schwer zu verstehen. Dort ist z.B. nicht klar welche Interfaces implementiert werden müssen (ModelMBean) oder von welchen Klassen man ableiten muss (RequiredModelMBean). Zum großen Verdruss ist auch kein ausführlicher Code auf der mitgelieferten CD vorhanden. Der beschrieben Beispielcode wirft eine ClassCastException, da die Methode ManagedBean.createMBean(Object) hart auf das Interface ModelMBean castet (sowohl Version 1.0 als auch 1.1 der Modeler API).
Durch dieses Beispiel wird leider dann auch der Sinn und Zweck der ModelMBean Spezifikation konterkariert. Diese sieht ja gerade vor, dass die zu managende Ressource nicht als MBean vorliegt, sondern ein POJO (Plain Old Java Object) sein kann, auf welches eine ModelMBean zugreifen kann.
Das Listing 4 des Artikels auf Seite 21 kann besser durch das folgende Codesnippet beschrieben werden:
final Management mnt = new Management();
final Thread t = Thread.currentThread();
final ClassLoader loader = t.getContextClassLoader();
// Commons Modeler ModelMBean Beschreibung aus Package anziehen.
final InputStream in =
loader.getResourceAsStream("de/speexx/playground/sascha/jmxtest/"
+ "mbean-descriptors.xml");
try {
// Eigentlicher Registrierungscode des Commons Modeles.
final Registry registry = Registry.getRegistry(mnt, null);
registry.loadMetadata(in);
registry.registerComponent(
mnt,
"SpeexX:type=CommonsModelerTest,name=CountManagement",
"objectReference"
);
} catch (final Exception e) {
e.printStackTrace();
}
Zu allem Überfluss fehlt in dem kompletten Artikel ebenfalls ein Hinweis auf das J2SE 5.0. In dieser Java Version ist die JMX Spezifikation als fester Betandteil enthalten und die Implementierung von Sun kommt mit der jconsole Applikation. Mittels dieser ist es erheblich einfacher das Beispiel nachzuvollziehen.
Hierfür habe ich eine einfaches Beispiel entwickelt, welches unter http://www.speexx.de/blog/files/2005/01/jmx-example-1.0.tar.gz herunter zu laden ist.
Nach dem build des Projektes mittels 'maven jar' kann die Beispielapplikation mit 'run.sh' gestartet werden. Die Ausgabe von 'waiting...' ist erst einmal wenig spektakulär. Spannend wird es, wenn auf einer zweiten Konsole im gleichen Verzeichnis 'run-jconsole.sh' ausgeführt wird. Das Managementprogramm verbindet sich mittles JMX mit dem zu managenden Programm. Dieses wird beim Start durch das Property '-Dcom.sun.management.jmxremote' als solches gekennzeichnet.
Über den Reiter MBeans wir ein im linken Teil ein Baum mit allen registrierten MBeans angezeigt. Hier erscheint auch das registrierte SpeexX ModelMBean.
Der count Wert ist nach dem Start 0. Nach dem auswählen des Operations Reiters im rechten Fensterteil und einem Klick auf 'incrementCount()' wird der Wert des Attributes um 1 erhöht.
Dies kann wiederum im über den Reiter Attributes und einem Refresh angezeigt werden:
Das Beispiel arbeitet nur mit dem J2SE 1.5 oder höher.

1) in mbeans-descriptor.xml "className" und "type" anpassen: <bean name='CountManagement' className='org.apache.commons.modeler.BaseModelMBean' type='de.speexx.playground.sascha.jmxtest.Management' description='Simple class to test the jakarta commons modeler.'> ... // Das was zuvor in "className" stand, ist also nach "type" gewandert und in "className" steht eine wirklich MBean-Klasse als Wrapper von Apache. 2) der Registrier-Aufruf sollte folgendermassen angepasst werden: final ObjectName oName = new ObjectName("SpeexX:type=CountManagement"); registry.registerComponent(mnt, oName, null); // Durch das "null" am Ende, verwendet Commons Modeler den Klassennamen der mnt Instanz.dann werden in der JMX Console auch die "description"-Informationen korrekt angezeigt. <p/> (Beitrag mit freundlicher Unterstützung von CK, MaH, TiJ)