October 25, 2008

JMX, MBeans, jconsole, VisualVM och Spring MBean

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)
Dynamiska MBeans:
  • 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

Bild 1. Attribut
Bild 2: Metoder

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

No comments: