JMX

Java Management Extensions

$JBOSS_HOME/bin/jconsole.sh

★使い方

import javax.management.MBean;

import javax.management.ManagedAttribute;

import javax.management.ManagedOperation;

@MBean

public class SampleMBean {

private int value = 0;

@ManagedAttribute

public int getValue() {

return value;

}

@ManagedAttribute

public void setValue(int value) {

this.value = value;

}

@ManagedOperation

public String tryValue(int value) {

return this.value == value ? "YES" : "NO";

}

}

import java.lang.management.ManagementFactory;

import javax.management.MBeanServer;

import javax.management.ObjectInstance;

import javax.management.ObjectName;

private static final String OBJECT_NAME = "<domain>:type=xxx";

MBeanServer server = ManagementFactory.getPlatformMBeanServer();

ObjectName objectName = new ObjectName(OBJECT_NAME);

assertEquals(0, server.getAttribute(objectName, "value"));

server.setAttribute(objectName, new Attribute("value", 3));

assertEquals("YES", server.invoke(objectName, "tryValue", new Object[]{3}, null));

assertEquals("NO", server.invoke(objectName, "tryValue", new Object[]{2}, null));

SampleMBean mbean = new SampleMBean();

server.registerMBean(mbean, objectName);

Set<ObjectInstance> instances = server.queryMBeans(new ObjectName(OBJECT_NAME), null);

ObjectInstance instance = (ObjectInstance) instances.toArray()[0];

System.out.println("Class Name: " + instance.getClassName());

System.out.println("Object Name: " + instance.getObjectName());

★List all JVM MBeans

BaseMXBean

★サンプル

import javax.management.MXBean;

@MXBean

public interface UserMXBean {

long getNumberOfUsers();

}

import java.lang.management.ManagementFactory;

import javax.annotation.PostConstruct;

import javax.management.MBeanServer;

import javax.management.ObjectName;

import lombok.SneakyThrows;

public abstract class BaseMXBean {

protected abstract String getType();

@SneakyThrows

@PostConstruct

public void initialize() {

ObjectName objectName = new ObjectName("type=" + this.getType());

MBeanServer server = ManagementFactory.getPlatformMBeanServer();

if (server.isRegistered(objectName)) {

server.unregisterMBean(objectName);

}

server.registerMBean(this, objectName);

}

}

import javax.ejb.Singleton;

import javax.ejb.Startup;

import javax.inject.Inject;

@Startup

@Singleton

public class UserMXBeanImpl extends BaseMXBean implements UserMXBean {

@Inject

private UserDao userDao;

@Override

public long getNumberOfUsers() {

return this.userDao.count();

}

@Override

protected String getType() {

return User.class.getSimpleName();

}

}

★カスタムAnnotationの利用

@MXBean

@Group("...")

@Name("...")

@Description("...")

public interface XxxMXBean {

@Name("...")

@Description("...")

void method(@Name("...") String arg);

}