Java Management Extension (JMX) är enkelt sätt att managera produktionssatt kod. Dels man kan inspektera property värden, men även anropa exponerade metoder och slutligen skicka och ta emot event. För exponera metoder/klasser använder man MBeans. Det finns fem MBeans:
Statiska MBeans:
- Standard MBeans
- MXBeans (J2SE 5/6)
- Dynamic MBeans
- Model MBeans
- Open MBeans
Statiska MBeans
Standard MBeans
Standard MBeans är den enklaste MBean typen och bygger på att man använder fördefinierade namnsättningar på sina klasser (introspection).
package se.msc.jmx;
public interface CalculatorMBean {
public int getMemory();
public void setMemory(int memory);
public int add(int x, int y);
public int divide(int x, int y);
}
package se.msc.jmx;
public class Calculator implements CalculatorMBean {
private int memory;
public int getMemory() {
return memory;
}
public void setMemory(int memory) {
this.memory = memory;
System.out.println("New memory=" + memory);
}
public int add(int x, int y) {
return x + y;
}
public int divide(int x, int y) {
return x / y;
}
}
package se.msc.jmx;
import java.lang.management.ManagementFactory;
import javax.management.MBeanServer;
import javax.management.ObjectName;
public class Bootstrap {
public static void main(String[] args) throws Exception {
MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
mbs.registerMBean(new Calculator(),
new ObjectName("se.msc.jmx:type=Calculator"));
System.out.println("Running...");
Thread.sleep(Long.MAX_VALUE);
}
}
Kompilera koden och start sedan:
$ java se.msc.jmx.Bootstrap
Starta sedan jconsole:
$ jconsole
och dubbelklicka se.msc.jmx
MXBeans
MXBeans skiljer sig inte mycket från Standard MBeans utan tillkom för att adressera brister i Standard implementationen:
- Interface och implementation måste ligga i samma paket.
- Man behöver inte följa namnstandard längre utan kan använda annotation - @MXBean.
- Man kan nu använda enum (Open Types)
Intressant är också att JRE tillhandahåller en hel del MXBeans, t.ex. GarbageCollectorMXBean och ThreadMXBean, se java.lang.management för komplett lista.
Dynamiska MBeans
Skillnaden mellan statiska och dynamiska MBeans är att dynamiska MBeans exponerar sina attribut och metoder i runtime och är inte hårt satta som i det statiska fallet.
Nyheter i J2SE 6
I J2SE 6 så har det inte tillkommit så mycket för JMX, men en stor skillnad på verktyg sidan är VisualVM. VisualVM är en sammanslagning av:
- jconsole – JMX console för Java SE 5/6
- jstat – JVM statistik monitoreringsverktyg
- jstack – stack trace för java processer
- jinfo – konfiguration av java processer
- jmap – minnesanvändning av java processer
Spring och JMX
Spring Framework gör livet enklare (som vanligt) för JMX utvecklare och om du redan använder Spring i ditt projekt, så rekommenderar jag varmt att använda Spring JMX. Det Spring JMX erbjuder:
- Exponering av vanliga klasser (icke JMX klasser) som MBeans
- Enklare notifieringshantering.
- Rikare metadata via annotering
Se Spring JMX http://static.springframework.org/spring/docs/2.0.x/reference/jmx.html för fullständig dokumentation.
Referenser:
Bugg i JMX local JMX registry: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6754672
J2SE 6 JMX Guide: http://java.sun.com/javase/6/docs/technotes/guides/jmx/
Remote Monitoring and Management: http://java.sun.com/j2se/1.5.0/docs/guide/management/agent.html#remote