- 浏览: 126417 次
文章分类
最新评论
-
qzwlf:
Android(四)数据存储之五网络 -
jiaoshiyao:
...
http响应头介绍 -
cherishlive:
请问Standard MBean如何支持复杂类型,可否大概的讲 ...
JMX MBeans之三Open MBean -
nihongye:
...
JMX MBeans之三Open MBean -
discolt:
报错
javax.management.MBeanExcep ...
JMX MBeans之四Model MBean (1)
-----------------------------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[3];
private ModelMBeanConstructorInfo[] dConstructors = new ModelMBeanConstructorInfo[1];
private ModelMBeanOperationInfo[] dOperations = new ModelMBeanOperationInfo[6];
private ModelMBeanNotificationInfo[] dNotifications = new ModelMBeanNotificationInfo[1];
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[0],
new String[0]);
} 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[i]).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[i] + ": Entry:" + ((String) pmEntries[i]).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[i].getName());
echo(" DESCR: \t"+ attrInfo[i].getDescription());
echo(" TYPE: \t"+ attrInfo[i].getType() +
"\tREAD: "+ attrInfo[i].isReadable() +
"\tWRITE: "+ attrInfo[i].isWritable());
echo(" DESCRIPTOR: \t" + (((ModelMBeanAttributeInfo)attrInfo[i]).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[i].getName());
echo(" DESCR: \t"+ constrInfo[i].getDescription());
echo(" PARAM: \t"+ constrInfo[i].getSignature().length +" parameter(s)");
echo(" DESCRIPTOR: \t" + (((ModelMBeanConstructorInfo)constrInfo[i]).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[i].getName());
echo(" DESCR: \t"+ opInfo[i].getDescription());
echo(" PARAM: \t"+ opInfo[i].getSignature().length +" parameter(s)");
echo(" DESCRIPTOR: \t" + (((ModelMBeanOperationInfo)opInfo[i]).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[i].getName());
echo(" DESCR: \t"+ notifInfo[i].getDescription());
echo(" DESCRIPTOR: \t" + (((ModelMBeanNotificationInfo)notifInfo[i]).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[0] = 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[1] = 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[2] = 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[0] = new ModelMBeanConstructorInfo("TestBean(): Constructs a TestBean App",
constructors[0],
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[0] = 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[1] = 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[2] = 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[3] = 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[4] = 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[5] = new ModelMBeanOperationInfo("setNbChanges",
"set NbChanges attribute",
setNbChangesParms,
"void",
MBeanOperationInfo.ACTION,
setNbChangesDesc);
//dNotifications[0] = 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[1];
genTypes[0] = "jmx.ModelMBean.General";
dNotifications[0] = 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[i].getName());
echo(" DESCR: \t"+ attrInfo[i].getDescription());
echo(" TYPE: \t"+ attrInfo[i].getType() +
"\tREAD: "+ attrInfo[i].isReadable() +
"\tWRITE: "+ attrInfo[i].isWritable());
echo(" DESCRIPTOR: \t" + (((ModelMBeanAttributeInfo)attrInfo[i]).getDescriptor()).toString());
}
} else echo(" ** No attributes **");
echo("CONSTRUCTORS");
MBeanConstructorInfo[] constrInfo = info.getConstructors();
for (int i=0; i<constrInfo.length; i++)
{
echo(" ** NAME: \t"+ constrInfo[i].getName());
echo(" DESCR: \t"+ constrInfo[i].getDescription());
echo(" PARAM: \t"+ constrInfo[i].getSignature().length +" parameter(s)");
echo(" DESCRIPTOR: \t" + (((ModelMBeanConstructorInfo)constrInfo[i]).getDescriptor()).toString());
}
echo("OPERATIONS");
MBeanOperationInfo[] opInfo = info.getOperations();
if (opInfo.length>0)
{
for (int i=0; i<opInfo.length; i++)
{
echo(" ** NAME: \t"+ opInfo[i].getName());
echo(" DESCR: \t"+ opInfo[i].getDescription());
echo(" PARAM: \t"+ opInfo[i].getSignature().length +" parameter(s)");
echo(" DESCRIPTOR: \t" + (((ModelMBeanOperationInfo)opInfo[i]).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[i].getName());
echo(" DESCR: \t"+ notifInfo[i].getDescription());
echo(" DESCRIPTOR: \t" + (((ModelMBeanNotificationInfo) notifInfo[i]).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[i]).getFields();
for (int j=0; j < afields.length; j++)
{
echo(afields[j] + "");
}
}
echo("Operation Descriptors:");
dArray = ((ModelMBeanInfo) mbi).getDescriptors("operation");
for (int i=0; i < dArray.length; i++)
{
echo("*Operation****************************");
String[] ofields = ((Descriptor) dArray[i]).getFields();
for (int j=0; j < ofields.length; j++)
{
echo(ofields[j] + "");
}
}
echo("Notification Descriptors:");
dArray = ((ModelMBeanInfo) mbi).getDescriptors("notification");
for (int i=0; i < dArray.length; i++)
{
System.out.println("**Notification****************************");
String[] nfields = ((Descriptor) dArray[i]).getFields();
for (int j=0; j < nfields.length; j++)
{
System.out.println(nfields[j] + "");
}
}
}
public void printModelMBeanDescriptors(ObjectName mbeanObjectName)
{
sleep(1000);
Descriptor[] dArray = new DescriptorSupport[0];
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[i]).getFields();
for (int j=0; j < dlfields.length; j++)
{
echo(dlfields[j] + "");
}
}
}
}
---------------------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.
相关推荐
jmx-mbeans 创建了自定义Mbean类,以接收一些简单操作(如求和操作)的度量。 创建了MBeanServer并注册了自定义Mbean类。 使用jconsole工具连接到我的MBeanServer。 在jconsole中,能够查看自定义Mbean属性,...
jmx 实例 rmi mbean,采用rmi方式进行jmx的mbean管理,通过这个实例能够了解jmx的应用
定制保险丝 通用 JMX Mbeans 的 JON Fuse 插件扩展
Java分布式应用学习笔记09JMX-MBean的介绍
本课程介绍JMXAPI的基本概念,它被称之为被管理的bean,或者MBean。MBean是一个被管理的Java对象,就像Javabean组件一样,但是它遵从JMX规范的设计模式。MBean可以表示设备、应用或者任何需要被管理的资源。MBeans...
JMX 1.2.1 Reference Implementation(重点) Include com.sun.jdmk.comm.HtmlAdaptorServer class http://www.sun.com/software/jdmk/ Downloads, sun-jdmk-runtime-5.1-b34.2.zip/SUNWjdmk/5.1/lib/jdmkrt.jar
JMX是指Java管理扩展,通过jmx可以监控java应用服务器的各项性能指标,jvm的性能指标等
NULL 博文链接:https://jasonhan-sh-hotmail-com.iteye.com/blog/1171904
通用 JMX MBean 收集器,它使用 Boundary API 创建指标并发布它们。 这个 java 应用程序读取一个配置文件,其名称作为参数传递。 配置文件是一个 JSON 结构,它定义了 JMX 连接、要收集的 MBean 属性以及边界度量...
Commons-JMX ... ObjectName objectName = MBeans.register(mbean); // Object name is: '<YourMXBean>:type=YourMXBean' 使用自定义名称注册MBean: IYourMXBean mbean = new YourMXBean(); ObjectName
书中提供了几个典型的例子,兼顾各种开发平台,这些例子的代码稍作修改就可以直接应用于项目开发之中,代码源文件可以从图灵网站下载。本书内容广泛且深入,同时适用于各个层次的Web应用开发人员。
JMX越来越多得出现在各种技术杂志、以及社区,如ibm的 developerworks和bea的dev2dev。不仅仅是SUN,许多厂商都宣布已经或是准备支持这一技术。IBM、BEA、HP、Marcomedia(JRun)这些大的厂商,而且还有许多小的软件...
1.JMX与SPRING 结合实例 2.标准MBean 与非标准MBean 注册 3.基于接口和注解的MBean 注册 4.发布通知,处理通知及配置
Description Resource Path Location Type Missing artifact com.sun.jmx:jmxri:jar:1.2.1 pom.xml /eshop-storm line 2 Maven Dependency Problem
JMX Instrumentor 是一个微型 Java 工具,用于将任意对象检测为 JMX 模型 MBean。 它通过反射检查对象的类并构造相应的 ModelMBeanInfo。 甚至可以通过特殊的 JMX 注释来改进此信息。
JMX的权威著作,很给力的。对JMX的全面深入描述,一本好书。
Tomcat 8 Extras catalina-jmx-remote.jar,JMX监控所需文件之一。 JMX Remote Lifecycle Listener - org.apache.catalina.mbeans.JmxRemoteLifecycleListener
jmx快速上手 jmx快速上手 jmx快速上手 jmx快速上手
JMX到Prometheus导出器:一个收集器,该收集器可以可配置地抓取和公开JMX目标的mBean。 该导出程序旨在作为Java代理运行,公开HTTP服务器并提供本地JVM的度量。 它也可以作为独立的HTTP服务器运行,并刮擦远程JMX...
jmxutils.zip,导出jmx mbean使导出jmx mbean变得容易