📄 relationagent.java
字号:
package book.jmx.examples;
import java.util.*;
import javax.management.*;
import javax.management.monitor.*;
import javax.management.relation.*;
public class RelationAgent {
public static void main(String[] args) {
try {
MBeanServer server = MBeanServerFactory.createMBeanServer();
// create the "observable" MBean
ThreadMonitor threads = new ThreadMonitor();
server.registerMBean(threads, new ObjectName("Example:name=Threads"));
// create the "observer"
GaugeMonitor mon = new GaugeMonitor();
mon.setObservedObject(new ObjectName(":name=Threads"));
mon.setObservedAttribute("ThreadCount");
mon.setGranularityPeriod(5 * 1000);
mon.setNotifyHigh(true);
mon.setThresholds(new Integer(30), new Integer(20));
server.registerMBean(mon, new ObjectName("Monitor:target=Threads"));
mon.start();
// create relation service, purgeRelations=true
ObjectName relationService = new ObjectName("Service:name=Relation");
RelationService service = new RelationService(true);
service.addNotificationListener(new RelationListener(), null, null);
server.registerMBean(service, relationService);
// "monitor" role meta data
RoleInfo monitorInfo = new RoleInfo(
"Monitor", // role name
"javax.management.monitor.GaugeMonitor",// class name
true, true, // isReadable, isWritable
0, RoleInfo.ROLE_CARDINALITY_INFINITY, // multiplicity [0..*]
"Describes a Monitor role." // description
);
// "observable" role meta data
RoleInfo observableInfo = new RoleInfo(
"Observable", // role name
"book.jmx.examples.ThreadMonitor", // class name
true, true, // isReadable, isWritable
1, 1, // multiplicity [1..1]
"Describes an observed MBean role." // description
);
// relation type template
RelationTypeSupport relationType = new RelationTypeSupport(
"ObservedMBean",
new RoleInfo[] { observableInfo, monitorInfo }
);
// add relation type to the service
server.invoke(relationService, "addRelationType",
new Object[] { relationType },
new String[] { RelationType.class.getName() }
);
// associate MBean to role
ArrayList list = new ArrayList();
list.add(new ObjectName("Monitor:target=Threads"));
Role monitor = new Role("Monitor", list);
// associate MBean to role
list = new ArrayList();
list.add(new ObjectName("Example:name=Threads"));
Role target = new Role("Observable", list);
RoleList roleList = new RoleList();
roleList.add(monitor);
roleList.add(target);
// create the relation
server.invoke(relationService, "createRelation",
new Object[] { "MyRelationID", "ObservedMBean", roleList },
new String[] {
String.class.getName(),
String.class.getName(),
RoleList.class.getName()
}
);
// create the adaptor instance
com.sun.jdmk.comm.HtmlAdaptorServer adaptor =
new com.sun.jdmk.comm.HtmlAdaptorServer();
server.registerMBean(adaptor,
new ObjectName("adaptor:protocol=HTTP"));
adaptor.start();
} catch (JMException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
static class RelationListener implements NotificationListener {
public void handleNotification(Notification n, Object hb) {
if (n instanceof RelationNotification) {
RelationNotification notif = (RelationNotification)n;
System.out.println(notif.getRelationId());
System.out.println(notif.getType());
System.out.println(notif.getMessage());
if (notif.getType().equals(
RelationNotification.RELATION_BASIC_REMOVAL)
) {
try {
String ID = notif.getRelationId();
ObjectName relationService = new ObjectName(
"Service:name=Relation"
);
MBeanServer server =
(MBeanServer)MBeanServerFactory.findMBeanServer(null).get(0);
Map map = (Map)server.invoke(
relationService,
"getReferencedMBeans",
new Object[] { ID },
new String[] { String.class.getName() }
);
Iterator it = map.keySet().iterator();
while(it.hasNext()) {
System.out.println("MBeans referenced by the relation:");
System.out.println(it.next());
}
} catch (JMException e) {
e.printStackTrace();
}
}
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -