【问题标题】:How to programmatically check JMX MBean operations and attributes?如何以编程方式检查 JMX MBean 操作和属性?
【发布时间】:2012-05-07 17:30:21
【问题描述】:

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

属性: 姓名 尺寸

操作: 获取名称() 获取大小()

有没有办法以编程方式检查属性和操作?我一直在使用 IBM WebSphere MBean,他们的文档不是很好。

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

使用 WebSphere wsadmin 工具,我实际上可以查看操作和属性。我想知道是否有办法对所有 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()

【问题讨论】:

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

标签: java jmx websphere-7 mbeans


【解决方案1】:

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

我不太清楚您是在谈论以编程方式从当前 JVM 内部还是从客户端远程查找 MBean。有许多 JMX 客户端库。你可能想试试我的SimpleJMX package

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

JmxClient client = new JmxClient(hostName, port);
Set<ObjectName> objectNames = getBeanNames() 
for (ObjectName name : objectNames) {
    MBeanAttributeInfo[] attributes = getAttributesInfo(name);
    MBeanOperationInfo[] operations = getOperationsInfo(name);
}

如果您询问当前的 JVM,那么您应该能够通过这种方式从内部 bean 获取 bean 信息:

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

【讨论】:

    【解决方案2】:

    这是一个用于 ActiveMQ 的简单 JMX 示例。将来只需替换 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"));
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-15
      • 1970-01-01
      • 2012-11-23
      • 1970-01-01
      • 2016-08-18
      相关资源
      最近更新 更多