[JMX] JMX API 직접 사용하여 JMX MBean 공개하고 모니터링 및 관리하기
오호.. JDK 1.5부터 그냥 들어있는 JMX 클라이언트 jconsole을 실행해봤습니다. 모니터링 정보가 나오는 군요. 머.. 이건 나중에 살펴보기로 하고;; 일단은 저렇게 모니터링 할 MBean을 공개하는 방법을 보겠습니다.
public class Main {
public static void main(String[] args) throws IOException {
ApplicationContext context =
new ClassPathXmlApplicationContext("sandbox/jmx/beans-jmx.xml");
FileReplicator documentReplicator =
(FileReplicator) context.getBean("documentReplicator");
try {
MBeanServer mbeanServer = ManagementFactory.getPlatformMBeanServer();
ObjectName objectName = new ObjectName("bean:name=documentReplicator");
RequiredModelMBean mbean = new RequiredModelMBean();
mbean.setManagedResource(documentReplicator, "objectReference");
Descriptor srcDirDescriptor = new DescriptorSupport(new String[]{
"name=SrcDir", "descriptorType=attribute",
"getMethod=getSrcDir", "setMethod=setSrcDir"});
ModelMBeanAttributeInfo srcDirInfo = new ModelMBeanAttributeInfo(
"SrcDir", "java.lang.String", "Source directory",
true, true, false, srcDirDescriptor);
Descriptor destDirDescriptor = new DescriptorSupport(new String[]{
"name=DestDir", "descriptorType=attribute",
"getMethod=getDestDir", "setMethod=setDestDir"});
ModelMBeanAttributeInfo destDirInfo = new ModelMBeanAttributeInfo(
"DestDir", "java.lang.String", "Destination directory",
true, true, false, destDirDescriptor);
ModelMBeanOperationInfo getSrcDirInfo = new ModelMBeanOperationInfo(
"Get source directory",
FileReplicator.class.getMethod("getSrcDir"));
ModelMBeanOperationInfo setSrcDirInfo = new ModelMBeanOperationInfo(
"Set source directory",
FileReplicator.class.getMethod("setSrcDir", String.class));
ModelMBeanOperationInfo getDestDirInfo = new ModelMBeanOperationInfo(
"Get destination directory",
FileReplicator.class.getMethod("getDestDir"));
ModelMBeanOperationInfo setDestDirInfo = new ModelMBeanOperationInfo(
"Set destination directory",
FileReplicator.class.getMethod("setDestDir", String.class));
ModelMBeanOperationInfo replicateInfo = new ModelMBeanOperationInfo(
"Replicate files",
FileReplicator.class.getMethod("replicate"));
ModelMBeanInfo mbeanInfo = new ModelMBeanInfoSupport(
"FileReplicator", "File replicator",
new ModelMBeanAttributeInfo[]{srcDirInfo, destDirInfo},
null,
new ModelMBeanOperationInfo[]{getSrcDirInfo, setSrcDirInfo,
getDestDirInfo, setDestDirInfo, replicateInfo},
null);
mbean.setModelMBeanInfo(mbeanInfo);
mbeanServer.registerMBean(mbean, objectName);
} catch (JMException e) {
e.printStackTrace();
} catch (InvalidTargetObjectTypeException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
System.in.read();
}
}
꺄오...
1. MBeanServer 인스턴스 가져오기
2. ObjectName 인스턴스 만들기 <- MBean의 이름(도메인:name=MBean이름)
2. MBean 인스턴스 만들기<- MBean으로 등록할 객체 설정.
3. ModelMBeanAttributeInfo 인스턴스 만들기 <- 객체의 속성에 해당함.
4. ModelMBeanOperationInfo 인스턴스 만들기 <- 객체의 메서드에 해당함.
5. ModelMBeanInfo 객체 만든 다음 2번에서 만든 MBean에 설정하기. <- 2, 3, 4번 조합
6. 1번에서 가져온 MBeanServer에 2번에서 만든 MBean 등록하기
이렇게 엄청난 과정과 Chekced Exception 들을 처리해주고..
실행할 때는 또 -Dcom.sun.management.jmxremote 이런 VM 인자까지 넘겨줘야지 모니터링이 됨.
그리고 마지막에 애플리케이션 꺼지지 않도록 System.in.read()로 대기 상태 만들어 둠.
콘솔로가서 jconsole 입력하고 MBeans 탭에서 bean 폴더 밑에 documentReplicator 찾으면 속성과 메서드를 바로 바로 실행해볼 수 있음.