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
★サンプル
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);
}