오호.. 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. 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()로 대기 상태 만들어 둠.