JMX MBeans之四Model MBean (2)
-----------------------------ModelAgent.java---------------------------------------------import java.lang.reflect.Constructor;
import javax.management.*;
import javax.management.modelmbean.*;
public class ModelAgent
{
/*
* 私有属性
*/
private String dClassName = "TestBean";
private String dDescription = "Simple implementation of a test app Bean.";
private ModelMBeanAttributeInfo[] dAttributes = new ModelMBeanAttributeInfo;
private ModelMBeanConstructorInfo[] dConstructors = new ModelMBeanConstructorInfo;
private ModelMBeanOperationInfo[] dOperations = new ModelMBeanOperationInfo;
private ModelMBeanNotificationInfo[] dNotifications = new ModelMBeanNotificationInfo;
private Descriptor mmbDesc = null;
// 这个Model MBean将会把信息放在ModelMBeanInfo对象中
private ModelMBeanInfo dMBeanInfo = null;
NotificationListener attrListener = null;
public ModelAgent()
{
// 创建MBeanServer
server = MBeanServerFactory.createMBeanServer();
try {
ObjectInstance html = server.createMBean(
"com.sun.jdmk.comm.HtmlAdaptorServer", null);
server.invoke(html.getObjectName(), "start", new Object,
new String);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args)
{
// 创建Agent...
ModelAgent agent = new ModelAgent();
// 执行演示方法
agent.doSimpleDemo();
}
// 私有方法
private void doSimpleDemo()
{
// build the simple MBean ObjectName
//
ObjectName mbeanObjectName = null;
String domain = server.getDefaultDomain();
String mbeanName = "ModelSample";
attrListener = (NotificationListener) new TestBeanAttributeChangeListener();
try
{
mbeanObjectName = new ObjectName(domain + ":type=" + mbeanName);
} catch (MalformedObjectNameException e)
{
echo("\t!!! Could not create the MBean ObjectName !!!");
e.printStackTrace();
echo("EXITING...");
System.exit(1);
}
// create and register the MBean
createMBean(mbeanObjectName, mbeanName);
// get and display the management information exposed by the MBean
printMBeanInfo(mbeanObjectName, mbeanName);
// create an event listener
createEventListeners(mbeanObjectName, attrListener);
// manage the MBean
manageSimpleBean(mbeanObjectName ,mbeanName);
// trying to do illegal management actions...
goTooFar(mbeanObjectName);
System.out.println("\nNow, you can point your browser to http://localhost:8082/");
System.out.println("or start your client application to connect to this agent.\n");
}
private void createMBean(ObjectName mbeanObjectName, String mbeanName)
{
echo("CREATE object name = " + mbeanObjectName );
// set management interface in ModelMBean - attributes, operations, notifications
buildDynamicMBeanInfo(mbeanObjectName, mbeanName);
try
{
RequiredModelMBean modelmbean = new RequiredModelMBean(dMBeanInfo);
// Set the managed resource for ModelMBean instance
modelmbean.setManagedResource(new TestBean(), "objectReference");
// register the ModelMBean in the MBean Server
server.registerMBean(modelmbean,mbeanObjectName);
} catch (Exception e)
{
echo("\t!!! ModelAgent: Could not create the " + mbeanName + " MBean !!!");
e.printStackTrace();
echo("EXITING...");
System.exit(1);
}
echo("\tModelMBean has been successfully created.");
}
private void createEventListeners(ObjectName mbeanObjectName, NotificationListener aListener)
{
try
{
server.invoke(mbeanObjectName, "addAttributeChangeNotificationListener",
(new Object[] {aListener, "State", null}),
(new String[] {"javax.management.NotificationListener",
"java.lang.String",
"java.lang.Object"}));
echo("\tEvent listener created successfully");
} catch (Exception e)
{
echo("Error! Creating Event listener with invoke failed with message:");
echo(e.getMessage() + "");
echo("EXITING...");
e.printStackTrace();
System.exit(1);
}
}
/**
* 通过getAttribute(), getAttributes(), setAttribute(), and setAttributes() 方法来访问属性
* 通过invoke()方法来调用reset()操作
*/
private void manageSimpleBean(ObjectName mbeanObjectName, String mbeanName)
{
echo("MANAGING the " + mbeanName + " MBean ");
echo("using its attributes and operations exposed for management");
try
{
// Get attribute values
sleep(1000);
echo("Printing attributes from ModelMBean ");
printSimpleAttributes(mbeanObjectName);
sleep(1000);
echo("Printing attributes from instance cache ");
printSimpleAttributes(mbeanObjectName);
// Change State attribute
sleep(1000);
echo(" Setting State attribute to value \"new state\"...");
Attribute stateAttribute = new Attribute("State","new state");
server.setAttribute(mbeanObjectName, stateAttribute);
// Get attribute values
sleep(1000);
printSimpleAttributes(mbeanObjectName);
echo("The NbChanges attribute is still \"0\" as its cached value is valid for 5 seconds (currencyTimeLimit=5s)");
echo("Wait for 5 seconds and print new attributes values ...");
sleep(5000);
printSimpleAttributes(mbeanObjectName);
// Invoking reset operation
sleep(1000);
echo(" Invoking reset operation...");
server.invoke(mbeanObjectName,"reset",null,null);
// Get attribute values 1
echo(" Printing reset attribute values");
sleep(1000);
printSimpleAttributes(mbeanObjectName);
echo("The State and NbChanges attributes are still \"1\" and \"new state\" as their cached value is valid for 5 seconds (currencyTimeLimit=5s)");
echo("Wait for 5 seconds and print new attributes values ...");
sleep(5000);
printSimpleAttributes(mbeanObjectName);
// Getting Notifications list
echo("Printing Notifications Broadcasted");
sleep(1000);
MBeanNotificationInfo[] myNotifys = (MBeanNotificationInfo[]) server.invoke(mbeanObjectName,
"getNotificationInfo",
null, null);
echo("\tSupported notifications are:");
for (int i=0; i<myNotifys.length; i++)
{
echo("\t\t" + ((ModelMBeanNotificationInfo)myNotifys).toString());
}
// Accesssing and printing Procol Map for NbChanges
echo(" Exercising Protocol map for NbChanges");
sleep(1000);
ModelMBeanInfo myMMBI = (ModelMBeanInfo) server.invoke(mbeanObjectName,
"getMBeanInfo",
null, null);
Descriptor myDesc = myMMBI.getDescriptor("NbChanges","attribute");
echo("\tRetrieving specific protocols:");
// echo("Descriptor: " + myDesc.toString());
Descriptor pm = (Descriptor) myDesc.getFieldValue("protocolMap");
// echo("ProtocolMap *"+pm.toString()+"*");
echo("\tProtocolMap lookup SNMP is " + pm.getFieldValue("SNMP"));
echo("\tProtocolMap lookup CIM is " + pm.getFieldValue("CIM"));
echo("\tDynamically updating Protocol Map:");
pm.setField("CIM","ManagedResource.LongVersion");
pm.setField("CMIP","SwitchData");
echo("\tPrinting Protocol Map");
String[] pmKeys = pm.getFieldNames();
Object[] pmEntries = pm.getFieldValues(null);
for (int i=0; i < pmKeys.length; i++)
{
echo("\tProtocol Map Name " + i + ": Name: " + pmKeys + ": Entry:" + ((String) pmEntries).toString());
}
echo(" Testing operation caching");
echo(" Invoking getNbResets");
Integer numResets = (Integer) server.invoke(mbeanObjectName,"getNbResets",null,null);
echo("\tReceived " + numResets + " from getNbResets first time");
echo(" Invoking second reset operation...");
server.invoke(mbeanObjectName,"reset",null,null);
Integer numResets2 = (Integer) server.invoke(mbeanObjectName,"getNbResets",null,null);
echo("\tReceived " + numResets2 + " from getNbResets second time (from operation cache)");
echo(" Invoking get of attribute ONLY provided through ModelMBeanAttributeInfo (should be 99)...");
Integer respHardValue = (Integer) server.getAttribute(mbeanObjectName,"HardValue");
echo("\tReceived " + respHardValue + " from getAttribute of hardValue");
} catch (Exception e)
{
echo("ManageSimpleBean failed with " + e.getMessage());
e.printStackTrace();
return;
}
}
private void goTooFar(ObjectName mbeanObjectName)
{
echo(">>> Trying to set the NbChanges attribute (read-only)!");
echo("... We should get an AttributeNotFoundException:");
sleep(1000);
// Try to set the NbChanges attribute
Attribute nbChangesAttribute = new Attribute("NbChanges", new Integer(1));
try
{
server.setAttribute(mbeanObjectName, nbChangesAttribute);
} catch (Exception e)
{
e.printStackTrace();
}
echo(">>> Trying to access the NbResets property (not exposed for management)!");
echo("... We should get an AttributeNotFoundException:");
sleep(1000);
// Try to access the NbResets property
try
{
server.getAttribute(mbeanObjectName,"NbResets");
} catch (Exception e)
{
e.printStackTrace();
}
return;
}
private void printMBeanInfo(ObjectName mbeanObjectName, String mbeanName)
{
echo(">>> Getting the management information for the "+ mbeanName + ":" + mbeanObjectName + " MBean");
echo(" using the getMBeanInfo method of the MBeanServer");
sleep(1000);
ModelMBeanInfo info = null;
try
{
info = (ModelMBeanInfo) (server.getMBeanInfo(mbeanObjectName));
if (info == null)
{
echo("ModelMBeanInfo from JMX Agent is null!");
}
} catch (Exception e)
{
echo("\t!!! ModelAgent:printMBeanInfo: Could not get MBeanInfo object for "+ mbeanName +" exception type " + e.getClass().toString() + ":" + e.getMessage() + "!!!");
e.printStackTrace();
return;
}
echo("CLASSNAME: \t"+ info.getClassName());
echo("DESCRIPTION: \t"+ info.getDescription());
try
{
echo("MBEANDESCRIPTOR: \t" + (info.getMBeanDescriptor()).toString());
} catch (Exception e)
{
echo("MBEANDESCRIPTOR: \tNone");
}
echo("ATTRIBUTES");
MBeanAttributeInfo[] attrInfo = (info.getAttributes());
if (attrInfo.length>0)
{
for (int i=0; i<attrInfo.length; i++)
{
echo(" ** NAME: \t"+ attrInfo.getName());
echo(" DESCR: \t"+ attrInfo.getDescription());
echo(" TYPE: \t"+ attrInfo.getType() +
"\tREAD: "+ attrInfo.isReadable() +
"\tWRITE: "+ attrInfo.isWritable());
echo(" DESCRIPTOR: \t" + (((ModelMBeanAttributeInfo)attrInfo).getDescriptor()).toString());
}
} else echo(" ** No attributes **");
MBeanConstructorInfo[] constrInfo = info.getConstructors();
echo("CONSTRUCTORS");
if (constrInfo.length > 0)
{
for (int i=0; i<constrInfo.length; i++)
{
echo(" ** NAME: \t"+ constrInfo.getName());
echo(" DESCR: \t"+ constrInfo.getDescription());
echo(" PARAM: \t"+ constrInfo.getSignature().length +" parameter(s)");
echo(" DESCRIPTOR: \t" + (((ModelMBeanConstructorInfo)constrInfo).getDescriptor()).toString());
}
} else echo(" ** No Constructors **");
echo("OPERATIONS");
MBeanOperationInfo[] opInfo = info.getOperations();
if (opInfo.length>0)
{
for (int i=0; i<opInfo.length; i++)
{
echo(" ** NAME: \t"+ opInfo.getName());
echo(" DESCR: \t"+ opInfo.getDescription());
echo(" PARAM: \t"+ opInfo.getSignature().length +" parameter(s)");
echo(" DESCRIPTOR: \t" + (((ModelMBeanOperationInfo)opInfo).getDescriptor()).toString());
}
} else echo(" ** No operations ** ");
echo("NOTIFICATIONS");
MBeanNotificationInfo[] notifInfo = info.getNotifications();
if (notifInfo.length>0)
{
for (int i=0; i<notifInfo.length; i++)
{
echo(" ** NAME: \t"+ notifInfo.getName());
echo(" DESCR: \t"+ notifInfo.getDescription());
echo(" DESCRIPTOR: \t" + (((ModelMBeanNotificationInfo)notifInfo).getDescriptor()).toString());
}
} else echo(" ** No notifications **");
echo("End of MBeanInfo print");
}
private void printSimpleAttributes(ObjectName mbeanObjectName)
{
try
{
echo("\tGetting attribute values:");
String State = (String) server.getAttribute(mbeanObjectName,"State");
Integer NbChanges = (Integer) server.getAttribute(mbeanObjectName,"NbChanges");
echo("\t\tState = \"" + State + "\"");
echo("\t\tNbChanges = \"" + NbChanges.toString() + "\"");
} catch (Exception e)
{
echo("\tModelAgent:printSimpleAttributes: !!! Could not read attributes !!!");
e.printStackTrace();
return;
}
}
private static void echo(String msg)
{
System.out.println(msg);
}
private static void sleep(int millis)
{
try
{
Thread.sleep(millis);
} catch (InterruptedException e)
{
return;
}
}
/*
* ------------------------------------------
* PRIVATE VARIABLES
* ------------------------------------------
*/
private MBeanServer server = null;
/*
* -----------------------------------------------------
* PRIVATE METHODS
* -----------------------------------------------------
*/
private void loadDynamicMBeanInfo(ObjectName inMbeanObjectName, String inMbeanName)
{
try
{
Class appBean = Class.forName(dClassName);
//echo("Setting mbeanDescriptor " + mmbDesc);
dMBeanInfo = new ModelMBeanInfoSupport(dClassName,
dDescription,
dAttributes,
dConstructors,
dOperations,
dNotifications,
mmbDesc);
} catch (Exception e)
{
echo("Exception in loadDynamicMBeanInfo : " + e.getMessage());
e.printStackTrace();
}
}
/**
* 创建私有的dMBeanInfo的各个字段
* 展示可以用来被管理的属性,构造器,操作以及通知等数据
*
* A reference to the dMBeanInfo object is returned by the getMBeanInfo() method
* of the DynamicMBean interface. Note that, once constructed, an MBeanInfo object is i
*/
private void buildDynamicMBeanInfo(ObjectName inMbeanObjectName, String inMbeanName)
{
try
{
Class appBean = Class.forName(dClassName);
// 为Model MBean设置描述符字段
mmbDesc = new DescriptorSupport(new String[] {("name="+inMbeanObjectName),
"descriptorType=mbean",
("displayName="+inMbeanName),
"log=T",
"logfile=jmxmain.log",
"currencyTimeLimit=5"});
// 为State属性设置描述符对象
Descriptor stateDesc = new DescriptorSupport();
stateDesc.setField("name","State");
stateDesc.setField("descriptorType","attribute");
stateDesc.setField("displayName","MyState");
stateDesc.setField("getMethod","getState");
stateDesc.setField("setMethod","setState");
stateDesc.setField("currencyTimeLimit","20");
dAttributes = new ModelMBeanAttributeInfo("State",
"java.lang.String",
"State: state string.",
true,
true,
false,
stateDesc);
// 为NbChanges属性设置描述符
Descriptor nbChangesDesc = new DescriptorSupport();
nbChangesDesc.setField("name","NbChanges");
nbChangesDesc.setField("descriptorType", "attribute");
nbChangesDesc.setField("default", "0");
nbChangesDesc.setField("displayName","MyChangesCount");
nbChangesDesc.setField("getMethod","getNbChanges");
nbChangesDesc.setField("setMethod","setNbChanges");
Descriptor nbChangesMap = new DescriptorSupport(new String[] {
"SNMP=1.3.6.9.12.15.18.21.0",
"CIM=ManagedResource.Version"});
nbChangesDesc.setField("protocolMap",(nbChangesMap));
dAttributes = new ModelMBeanAttributeInfo("NbChanges",
"java.lang.Integer",
"NbChanges: number of times the State string",
true,
false,
false,
nbChangesDesc);
// 为HardValue属性设置描述符
Descriptor hardValueDesc = new DescriptorSupport();
hardValueDesc.setField("name","HardValue");
hardValueDesc.setField("descriptorType","attribute");
hardValueDesc.setField("value", new Integer("99"));
hardValueDesc.setField("displayName","HardCodedValue");
hardValueDesc.setField("currencyTimeLimit","0");
/* currencyTimeLimit = 0 表示缓存在描述符对象中的值是永远有效的
* 当我们调用getAttribute方法访问这个属性的时候,会从描述符对象中读到99*/
dAttributes = new ModelMBeanAttributeInfo("HardValue",
"java.lang.Integer",
"HardValue: static value in ModelMBeanInfo and not in TestBean",
true,
false,
false,
hardValueDesc);
Constructor[] constructors = appBean.getConstructors();
// 定义构造器描述符信息
Descriptor testBeanDesc = new DescriptorSupport();
testBeanDesc.setField("name","TestBean");
testBeanDesc.setField("descriptorType", "operation");
testBeanDesc.setField("role","constructor");
dConstructors = new ModelMBeanConstructorInfo("TestBean(): Constructs a TestBean App",
constructors,
testBeanDesc);
MBeanParameterInfo[] params = null;
// 定义reset操作描述符信息
Descriptor resetDesc = new DescriptorSupport();
resetDesc.setField("name","reset");
resetDesc.setField("descriptorType","operation");
resetDesc.setField("class","TestBean");
resetDesc.setField("role","operation");
dOperations = new ModelMBeanOperationInfo("reset",
"reset(): reset State and NbChanges",
params ,
"void",
MBeanOperationInfo.ACTION,
resetDesc);
// 定义getNbResets操作描述符信息
Descriptor getNbResetsDesc = new DescriptorSupport(new String[] {"name=getNbResets",
"class=TestBeanFriend",
"descriptorType=operation",
"role=operation"});
TestBeanFriend tbf = new TestBeanFriend();
getNbResetsDesc.setField("targetObject",tbf);
getNbResetsDesc.setField("targetType","objectReference");
dOperations = new ModelMBeanOperationInfo("getNbResets",
"getNbResets(): get number of resets done",
params ,
"java.lang.Integer",
MBeanOperationInfo.INFO,
getNbResetsDesc);
// 定义getState操作描述符信息
Descriptor getStateDesc = new DescriptorSupport(new String[] {"name=getState",
"descriptorType=operation",
"class=TestBean",
"role=operation"} );
dOperations = new ModelMBeanOperationInfo("getState",
"get state attribute",
params ,
"java.lang.String",
MBeanOperationInfo.ACTION,
getStateDesc);
// 定义setState操作描述符信息
Descriptor setStateDesc = new DescriptorSupport(new String[] {
"name=setState",
"descriptorType=operation",
"class=TestBean",
"role=operation"});
MBeanParameterInfo[] setStateParms = new MBeanParameterInfo[] { (new MBeanParameterInfo("newState",
"java.lang.String",
"new State value") )} ;
dOperations = new ModelMBeanOperationInfo("setState",
"set State attribute",
setStateParms,
"void",
MBeanOperationInfo.ACTION,
setStateDesc);
// 定义getNbChanges操作描述符信息
Descriptor getNbChangesDesc = new DescriptorSupport( new String[] {
"name=getNbChanges",
"descriptorType=operation",
"class=TestBean",
"role=operation"});
dOperations = new ModelMBeanOperationInfo("getNbChanges",
"get NbChanges attribute",
params,
"java.lang.Integer",
MBeanOperationInfo.INFO,
getNbChangesDesc);
// 定义参数描述符信息
Descriptor setNbChangesDesc = new DescriptorSupport(new String[] {
"name=setNbChanges",
"descriptorType=operation",
"class=TestBean",
"role=operation"});
MBeanParameterInfo[] setNbChangesParms = new MBeanParameterInfo[] { (new MBeanParameterInfo("newNbChanges",
"java.lang.Integer",
"new value for Number of Changes") )} ;
dOperations = new ModelMBeanOperationInfo("setNbChanges",
"set NbChanges attribute",
setNbChangesParms,
"void",
MBeanOperationInfo.ACTION,
setNbChangesDesc);
//dNotifications = new MBeanNotificationInfo((new String[] {"jmx.attribute.change"}),
// "AttributeChange","ModelMBean Attribute Change Event");
// 定义通知描述符信息
Descriptor genEventDesc = new DescriptorSupport(new String[] {"descriptorType=notification",
"name=jmx.ModelMBean.General",
"severity=4",
"MessageId=MA001",
"log=T",
"logfile=jmx.log"});
String[] genTypes = new String;
genTypes = "jmx.ModelMBean.General";
dNotifications = new ModelMBeanNotificationInfo(genTypes,
"jmx.ModelMBean.General", // was Generic
"Generic Event",
genEventDesc); // test event
// 定义了ModelBean元数据信息
dMBeanInfo = new ModelMBeanInfoSupport(dClassName,
dDescription,
dAttributes,
dConstructors,
dOperations,
dNotifications);
dMBeanInfo.setMBeanDescriptor(mmbDesc);
} catch (Exception e)
{
echo("Exception in buildDynamicMBeanInfo : " + e.getMessage());
e.printStackTrace();
}
}
public void printLocalMBeanInfo(MBeanInfo info)
{
echo("CLASSNAME: \t"+ info.getClassName());
echo("DESCRIPTION: \t"+ info.getDescription());
echo("ATTRIBUTES");
MBeanAttributeInfo[] attrInfo = info.getAttributes();
if (attrInfo.length>0)
{
for (int i=0; i<attrInfo.length; i++)
{
echo(" ** NAME: \t"+ attrInfo.getName());
echo(" DESCR: \t"+ attrInfo.getDescription());
echo(" TYPE: \t"+ attrInfo.getType() +
"\tREAD: "+ attrInfo.isReadable() +
"\tWRITE: "+ attrInfo.isWritable());
echo(" DESCRIPTOR: \t" + (((ModelMBeanAttributeInfo)attrInfo).getDescriptor()).toString());
}
} else echo(" ** No attributes **");
echo("CONSTRUCTORS");
MBeanConstructorInfo[] constrInfo = info.getConstructors();
for (int i=0; i<constrInfo.length; i++)
{
echo(" ** NAME: \t"+ constrInfo.getName());
echo(" DESCR: \t"+ constrInfo.getDescription());
echo(" PARAM: \t"+ constrInfo.getSignature().length +" parameter(s)");
echo(" DESCRIPTOR: \t" + (((ModelMBeanConstructorInfo)constrInfo).getDescriptor()).toString());
}
echo("OPERATIONS");
MBeanOperationInfo[] opInfo = info.getOperations();
if (opInfo.length>0)
{
for (int i=0; i<opInfo.length; i++)
{
echo(" ** NAME: \t"+ opInfo.getName());
echo(" DESCR: \t"+ opInfo.getDescription());
echo(" PARAM: \t"+ opInfo.getSignature().length +" parameter(s)");
echo(" DESCRIPTOR: \t" + (((ModelMBeanOperationInfo)opInfo).getDescriptor()).toString());
}
} else echo(" ** No operations ** ");
echo("NOTIFICATIONS");
MBeanNotificationInfo[] notifInfo = info.getNotifications();
if (notifInfo.length>0)
{
for (int i=0; i<notifInfo.length; i++)
{
echo(" ** NAME: \t"+ notifInfo.getName());
echo(" DESCR: \t"+ notifInfo.getDescription());
echo(" DESCRIPTOR: \t" + (((ModelMBeanNotificationInfo) notifInfo).getDescriptor()).toString());
}
} else echo(" ** No notifications **");
}
public void printLocalDescriptors(MBeanInfo mbi) throws javax.management.MBeanException
{
echo(mbi.getDescription() + "Descriptors:");
echo("Attribute Descriptors:");
Descriptor[] dArray;
dArray = ((ModelMBeanInfo) mbi).getDescriptors("attribute");
for (int i = 0; i < dArray.length; i++)
{
String[] afields = ((Descriptor) dArray).getFields();
for (int j=0; j < afields.length; j++)
{
echo(afields + "");
}
}
echo("Operation Descriptors:");
dArray = ((ModelMBeanInfo) mbi).getDescriptors("operation");
for (int i=0; i < dArray.length; i++)
{
echo("*Operation****************************");
String[] ofields = ((Descriptor) dArray).getFields();
for (int j=0; j < ofields.length; j++)
{
echo(ofields + "");
}
}
echo("Notification Descriptors:");
dArray = ((ModelMBeanInfo) mbi).getDescriptors("notification");
for (int i=0; i < dArray.length; i++)
{
System.out.println("**Notification****************************");
String[] nfields = ((Descriptor) dArray).getFields();
for (int j=0; j < nfields.length; j++)
{
System.out.println(nfields + "");
}
}
}
public void printModelMBeanDescriptors(ObjectName mbeanObjectName)
{
sleep(1000);
Descriptor[] dArray = new DescriptorSupport;
try
{
dArray = (Descriptor[]) (server.invoke(mbeanObjectName, "getDescriptors",
new Object[] {},
new String[] {}));
if (dArray == null)
{
echo("Descriptor list is null!");
}
} catch (Exception e)
{
echo("\t!!! Could not get descriptors for mbeanName ");
e.printStackTrace();
return;
}
echo("Descriptors: (");
echo(dArray.length + ")");
for (int i=0; i < dArray.length; i++)
{
echo("**Descriptor***********************");
String[] dlfields = ((Descriptor) dArray).getFields();
for (int j=0; j < dlfields.length; j++)
{
echo(dlfields + "");
}
}
}
}
---------------------TestBeanAttributeChangeListener.java------------------------------
import javax.management.NotificationListener;
import javax.management.AttributeChangeNotification;
import javax.management.Notification;
/**
* 实现了NotificationListener接口.
* 监听和接受由ModelMBean发出的改变属性的通知
*/
public class TestBeanAttributeChangeListener implements NotificationListener {
public void handleNotification(Notification acn, Object handback) {
echo("\n\tTestBeanAttributeChangeListener received Attribute ChangeNotification ");
AttributeChangeNotification myacn = (AttributeChangeNotification) acn;
echo("\t\tEvent: " + acn.getType());
echo("\t\tAttribute: " + myacn.getAttributeName());
echo("\t\tAttribute type: " + myacn.getAttributeType());
echo("\t\tOld value: " + myacn.getOldValue());
echo("\t\tNew value: " + myacn.getNewValue());
}
private static void echo(String outstr) {
System.out.println(outstr);
}
}
-----------------------------TestBean.java---------------------------------------------
/**
* 被ModelMBean管理的一个简单定义的Bean --TestBean
* 这个Bean展示了两个属性,和一个操作
* State属性是可读可写的,NbChanges是只读的,还有reset()操作
*/
public class TestBean
implements java.io.Serializable
{
// 私有变量
private String state = "initial state";
private int nbChanges = 0;
private int nbResets = 0;
public TestBean() {
echo("\tTestBean Constructor Invoked: State " + state + " nbChanges: " + nbChanges + " nbResets: " + nbResets);
}
/**
* Getter
*/
public String getState() {
echo("\tTestBean: getState invoked: " + state);
return state;
}
/**
* Setter
*/
public void setState(String s) {
state = s;
nbChanges++;
echo("\tTestBean: setState to " + state + " nbChanges: " + nbChanges);
}
/**
* Getter
*/
public Integer getNbChanges() {
echo("\tTestBean: getNbChanges invoked: " + nbChanges);
return new Integer(nbChanges);
}
/**
* reset操作
*/
public void reset() {
echo("\tTestBean: reset invoked ");
state = "reset initial state";
nbChanges = 0;
nbResets++;
}
/**
* 返回reset次数属性值
* This method is not a Getter in the JMX sense because
* it is not returned by the getMBeanInfo() method.
*/
public Integer getNbResets() {
echo("\tTestBean: getNbResets invoked: " + nbResets);
return new Integer(nbResets);
}
private void echo(String outstr) {
System.out.println(outstr);
}
}
----------------------------------TestBeanFriend.java--------------------------------
/**
* 被ModelMBean管理的一个简单定义的Bean --TestBeanFriend.
* 和TestBean几乎一样.
*/
public class TestBeanFriend
implements java.io.Serializable
{
private String state = "initial state";
private int nbChanges = 0;
private int nbResets = 0;
public TestBeanFriend() {
echo("\tTestBeanFriend Constructor invoked: State " + state + " nbChanges: " + nbChanges + " nbResets: " + nbResets);
}
/**
* Getter.
*/
public String getState() {
echo("\tTestBeanFriend: getState invoked:" + state);
return state;
}
/**
* Setter.
*/
public void setState(String s) {
state = s;
nbChanges++;
echo("\tTestBeanFriend: setState invoked: to " + state + " nbChanges: " + nbChanges);
}
/**
* Getter.
*/
public Integer getNbChanges() {
echo("\tTestBeanFriend:getNbChanges invoked: " + nbChanges);
return new Integer(nbChanges);
}
/**
* reset Operation.
*/
public void reset() {
echo("\tTestBeanFriend: reset invoked ");
state = "reset initial state";
nbChanges = 0;
nbResets++;
}
/**
* Return the "NbResets" property.
* This method is not a Getter in the JMX sense because
* it is not returned by the getMBeanInfo() method.
*/
public Integer getNbResets() {
echo("\tTestBeanFriend: getNbResets invoked " + nbResets);
return new Integer(nbResets);
}
private void echo(String outstr) {
System.out.println(outstr);
}
}
--------------------------------OUTPUT------------------------------
CREATE object name = DefaultDomain:type=ModelSample
TestBeanFriend Constructor invoked: State initial state nbChanges: 0 nbResets: 0
TestBean Constructor Invoked: State initial state nbChanges: 0 nbResets: 0
ModelMBean has been successfully created.
>>> Getting the management information for the ModelSample:DefaultDomain:type=ModelSample MBean
using the getMBeanInfo method of the MBeanServer
CLASSNAME: TestBean
DESCRIPTION: Simple implementation of a test app Bean.
MBEANDESCRIPTOR: logfile=jmxmain.log, log=T, visibility=1, currencytimelimit=5, descriptortype=mbean, name=DefaultDomain:type=ModelSample, displayname=ModelSample, persistpolicy=never
ATTRIBUTES
** NAME: State
DESCR: State: state string.
TYPE: java.lang.String READ: true WRITE: true
DESCRIPTOR: setmethod=setState, getmethod=getState, currencytimelimit=20, descriptortype=attribute, displayname=MyState, name=State
** NAME: NbChanges
DESCR: NbChanges: number of times the State string
TYPE: java.lang.Integer READ: true WRITE: false
DESCRIPTOR: setmethod=setNbChanges, getmethod=getNbChanges, protocolmap=(snmp=1.3.6.9.12.15.18.21.0, cim=ManagedResource.Version), default=0, descriptortype=attribute, displayname=MyChangesCount, name=NbChanges
** NAME: HardValue
DESCR: HardValue: static value in ModelMBeanInfo and not in TestBean
TYPE: java.lang.Integer READ: true WRITE: false
DESCRIPTOR: value=(99), currencytimelimit=0, descriptortype=attribute, displayname=HardCodedValue, name=HardValue
CONSTRUCTORS
** NAME: TestBean
DESCR: TestBean(): Constructs a TestBean App
PARAM: 0 parameter(s)
DESCRIPTOR: role=constructor, descriptortype=operation, displayname=TestBean, name=TestBean
OPERATIONS
** NAME: reset
DESCR: reset(): reset State and NbChanges
PARAM: 0 parameter(s)
DESCRIPTOR: class=TestBean, role=operation, descriptortype=operation, displayname=reset, name=reset
** NAME: getNbResets
DESCR: getNbResets(): get number of resets done
PARAM: 0 parameter(s)
DESCRIPTOR: class=TestBeanFriend, targetobject=(TestBeanFriend@34a1fc), role=operation, targettype=objectReference, descriptortype=operation, name=getNbResets, displayname=getNbResets
** NAME: getState
DESCR: get state attribute
PARAM: 0 parameter(s)
DESCRIPTOR: class=TestBean, role=operation, descriptortype=operation, displayname=getState, name=getState
** NAME: setState
DESCR: set State attribute
PARAM: 1 parameter(s)
DESCRIPTOR: class=TestBean, role=operation, descriptortype=operation, displayname=setState, name=setState
** NAME: getNbChanges
DESCR: get NbChanges attribute
PARAM: 0 parameter(s)
DESCRIPTOR: class=TestBean, role=operation, descriptortype=operation, displayname=getNbChanges, name=getNbChanges
** NAME: setNbChanges
DESCR: set NbChanges attribute
PARAM: 1 parameter(s)
DESCRIPTOR: class=TestBean, role=operation, descriptortype=operation, displayname=setNbChanges, name=setNbChanges
NOTIFICATIONS
** NAME: jmx.ModelMBean.General
DESCR: Generic Event
DESCRIPTOR: logfile=jmx.log, log=T, messageid=MA001, severity=4, descriptortype=notification, name=jmx.ModelMBean.General, displayname=jmx.ModelMBean.General
End of MBeanInfo print
Event listener created successfully
MANAGING the ModelSample MBean
using its attributes and operations exposed for management
Printing attributes from ModelMBean
Getting attribute values:
TestBean: getState invoked: initial state
TestBean: getNbChanges invoked: 0
State = "initial state"
NbChanges = "0"
Printing attributes from instance cache
Getting attribute values:
State = "initial state"
NbChanges = "0"
Setting State attribute to value "new state"...
TestBean: setState to new state nbChanges: 1
TestBeanAttributeChangeListener received Attribute ChangeNotification
Event: jmx.attribute.change
Attribute: State
Attribute type: java.lang.String
Old value: initial state
New value: new state
Getting attribute values:
State = "new state"
NbChanges = "0"
The NbChanges attribute is still "0" as its cached value is valid for 5 seconds (currencyTimeLimit=5s)
Wait for 5 seconds and print new attributes values ...
Getting attribute values:
TestBean: getNbChanges invoked: 1
State = "new state"
NbChanges = "1"
Invoking reset operation...
TestBean: reset invoked
Printing reset attribute values
Getting attribute values:
State = "new state"
NbChanges = "1"
The State and NbChanges attributes are still "1" and "new state" as their cached value is valid for 5 seconds (currencyTimeLimit=5s)
Wait for 5 seconds and print new attributes values ...
Getting attribute values:
TestBean: getNbChanges invoked: 0
State = "new state"
NbChanges = "0"
Printing Notifications Broadcasted
Supported notifications are:
ModelMBeanNotificationInfo: GENERIC ; Description: A text notification has been issued by the managed resource ; Descriptor: log=T, severity=6, descriptortype=notification, displayname=jmx.modelmbean.generic, name=GENERIC ; Types: jmx.modelmbean.generic
ModelMBeanNotificationInfo: ATTRIBUTE_CHANGE ; Description: Signifies that an observed MBean attribute value has changed ; Descriptor: log=T, severity=6, descriptortype=notification, displayname=jmx.attribute.change, name=ATTRIBUTE_CHANGE ; Types: jmx.attribute.change
ModelMBeanNotificationInfo: jmx.ModelMBean.General ; Description: Generic Event ; Descriptor: logfile=jmx.log, log=T, messageid=MA001, severity=4, descriptortype=notification, name=jmx.ModelMBean.General, displayname=jmx.ModelMBean.General ; Types: jmx.ModelMBean.General
Exercising Protocol map for NbChanges
Retrieving specific protocols:
ProtocolMap lookup SNMP is 1.3.6.9.12.15.18.21.0
ProtocolMap lookup CIM is ManagedResource.Version
Dynamically updating Protocol Map:
Printing Protocol Map
Protocol Map Name 0: Name: cmip: Entry:SwitchData
Protocol Map Name 1: Name: snmp: Entry:1.3.6.9.12.15.18.21.0
Protocol Map Name 2: Name: cim: Entry:ManagedResource.LongVersion
Testing operation caching
Invoking getNbResets
TestBeanFriend: getNbResets invoked 0
Received 0 from getNbResets first time
Invoking second reset operation...
TestBean: reset invoked
Received 0 from getNbResets second time (from operation cache)
Invoking get of attribute ONLY provided through ModelMBeanAttributeInfo (should be 99)...
Received 99 from getAttribute of hardValue
>>> Trying to set the NbChanges attribute (read-only)!
... We should get an AttributeNotFoundException:
javax.management.AttributeNotFoundException: setAttribute failed: NbChanges is not writable
at javax.management.modelmbean.RequiredModelMBean.setAttribute(RequiredModelMBean.java:1675)
at com.sun.jmx.mbeanserver.DynamicMetaDataImpl.setAttribute(DynamicMetaDataImpl.java:188)
at com.sun.jmx.mbeanserver.MetaDataImpl.setAttribute(MetaDataImpl.java:214)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.setAttribute(DefaultMBeanServerInterceptor.java:744)
at com.sun.jmx.mbeanserver.JmxMBeanServer.setAttribute(JmxMBeanServer.java:730)
at ModelAgent.goTooFar(ModelAgent.java:261)
at ModelAgent.doSimpleDemo(ModelAgent.java:83)
at ModelAgent.main(ModelAgent.java:46)
>>> Trying to access the NbResets property (not exposed for management)!
... We should get an AttributeNotFoundException:
javax.management.AttributeNotFoundException: getAttribute failed: ModelMBeanAttributeInfo not found for NbResets
at javax.management.modelmbean.RequiredModelMBean.getAttribute(RequiredModelMBean.java:1323)
at com.sun.jmx.mbeanserver.DynamicMetaDataImpl.getAttribute(DynamicMetaDataImpl.java:104)
at com.sun.jmx.mbeanserver.MetaDataImpl.getAttribute(MetaDataImpl.java:189)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.getAttribute(DefaultMBeanServerInterceptor.java:645)
at com.sun.jmx.mbeanserver.JmxMBeanServer.getAttribute(JmxMBeanServer.java:667)
at ModelAgent.goTooFar(ModelAgent.java:272)
at ModelAgent.doSimpleDemo(ModelAgent.java:83)
at ModelAgent.main(ModelAgent.java:46)
Now, you can point your browser to http://localhost:8082/
or start your client application to connect to this agent.
页:
[1]