Java 如何以编程方式检查JMX MBean操作和属性?

Java 如何以编程方式检查JMX MBean操作和属性?,java,jmx,websphere-7,mbeans,Java,Jmx,Websphere 7,Mbeans,假设我们有一个MBean,它具有以下属性和操作 属性: 名称 大小 操作: getName() getSize() 有没有办法通过编程检查属性和操作?我一直在使用IBMWebSphereMBean,它们的文档不是很好 例如,如果您转到并导航到网络部署->参考->编程接口->Mbean接口->线程池。它们只列出了属性,没有操作 使用webspherewsadmin工具,我实际上可以检查操作和属性。我想知道有没有办法让所有MBean都这么做 wsadmin>print Help.attribu

假设我们有一个MBean,它具有以下属性和操作

属性: 名称 大小

操作: getName() getSize()

有没有办法通过编程检查属性和操作?我一直在使用IBMWebSphereMBean,它们的文档不是很好

例如,如果您转到并导航到网络部署->参考->编程接口->Mbean接口->线程池。它们只列出了属性,没有操作

使用webspherewsadmin工具,我实际上可以检查操作和属性。我想知道有没有办法让所有MBean都这么做

wsadmin>print Help.attributes(object)
Attribute                       Type                            Access
name                            java.lang.String                RO
maximumSize                     int                             RW
minimumSize                     int                             RW
inactivityTimeout               long                            RW
growable                        boolean                         RW
stats                           javax.management.j2ee.statistics.Stats  RO

wsadmin>print Help.operations(object)
Operation
java.lang.String getName()
int getMaximumPoolSize()
void setMaximumPoolSize(int)
int getMinimumPoolSize()
void setMinimumPoolSize(int)
long getKeepAliveTime()
void setKeepAliveTime(long)
boolean isGrowAsNeeded()
void setGrowAsNeeded(boolean)
javax.management.j2ee.statistics.Stats getStats()
如何以编程方式检查JMX MBean操作和属性

我不太清楚您所说的是从当前JVM内部以编程方式查找MBean,还是从客户端远程查找MBean。有许多JMX客户端库。你可以试试我的

使用我的代码,您可以执行以下操作:

JmxClient client = new JmxClient(hostName, port);
Set<ObjectName> objectNames = getBeanNames() 
for (ObjectName name : objectNames) {
    MBeanAttributeInfo[] attributes = getAttributesInfo(name);
    MBeanOperationInfo[] operations = getOperationsInfo(name);
}
JmxClient client=新的JmxClient(主机名、端口);
Set objectNames=getBeanNames()
for(ObjectName名称:objectNames){
MBeanAttributeInfo[]attributes=GetAttributeInfo(名称);
MBeanOperationInfo[]operations=getOperationsInfo(名称);
}
如果您询问当前JVM,那么您应该能够通过以下方式从内部bean获取bean信息:

MBeanServer server = ManagementFactory.getPlatformMBeanServer();
Set<ObjectName> objectNames = server.queryNames(null, null);
for (ObjectName name : objectNames) {
    MBeanInfo info = server.getMBeanInfo(name);
}
MBeanServer服务器=ManagementFactory.getPlatformMBeanServer();
Set objectNames=server.queryNames(null,null);
for(ObjectName名称:objectNames){
MBeanInfo info=server.getMBeanInfo(名称);
}

下面是一个简单的JMX for ActiveMQ示例。只需替换activeMQ值,对将来的用户可能很有用:

String brokerName = "AMQBroker";
String username = "";
String password = "";
String hostname = "localhost";
int port = 1099;

Map<String, Object> env = new HashMap<String, Object>();
if (username != null || password != null) {
    String[] credentials = new String[] { username, password };
    env.put("jmx.remote.credentials", credentials);
}

JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://" + hostname + ":" + port + "/jmxrmi");
JMXConnector jmxc = JMXConnectorFactory.connect(url, env);
MBeanServerConnection conn = jmxc.getMBeanServerConnection();

// here is example for Type=Broker, can be different like
// "org.apache.activemq:BrokerName=" + brokerName + ",Type=Connection,ConnectorName=openwire,Connection=*"
// "org.apache.activemq:BrokerName=" + brokerName + ",*,Type=NetworkBridge" or same for Queue, Topic, Subscription
ObjectName name = new ObjectName("org.apache.activemq:BrokerName=" + brokerName + ",Type=Broker");
Set<ObjectName> queryNames = conn.queryNames(name, null);
// here is set with one element, but can be more depending on ObjectName query
for (ObjectName objectName : queryNames) {
    System.out.println(objectName.getCanonicalName());
    // use attribute you can be interested in
    System.out.println(conn.getAttribute(objectName, "Slave"));
}
String brokerName=“AMQBroker”;
字符串username=“”;
字符串密码=”;
字符串hostname=“localhost”;
int端口=1099;
Map env=new HashMap();
如果(用户名!=null | |密码!=null){
字符串[]凭据=新字符串[]{username,password};
env.put(“jmx.remote.credentials”,凭证);
}
JMXServiceURL=newjmxserviceurl(“服务:jmx:rmi:///jndi/rmi://“+hostname+”:“+port+”/jmxrmi”);
JMXConnector jmxc=JMXConnectorFactory.connect(url,env);
MBeanServerConnection conn=jmxc.getMBeanServerConnection();
//下面是Type=Broker的示例,可以不同于
//“org.apache.activemq:BrokerName=“+BrokerName+”,类型=连接,ConnectorName=openwire,连接=*”
//“org.apache.activemq:BrokerName=“+BrokerName+”,*,Type=NetworkBridge”或与队列、主题、订阅相同
ObjectName name=newobjectname(“org.apache.activemq:BrokerName=“+BrokerName+”,Type=Broker”);
设置queryNames=conn.queryNames(名称,null);
//此处设置了一个元素,但可以更多地取决于ObjectName查询
对于(ObjectName ObjectName:queryNames){
System.out.println(objectName.getCanonicalName());
//使用您可能感兴趣的属性
System.out.println(conn.getAttribute(objectName,“Slave”);
}

我的回答对@MD6380有帮助吗?