2009-12-23 105 views
1

我正在为我们的产品中的JMX接口编写一些测试用例。我可以从标准MBean访问属性(以下是sun tutorial)。但是,我似乎无法访问动态MBean。这些属性完全来自JConsole(可读/可写)。如何从jmx客户端访问dynamicmbeans

JMXConnector jmxc = getJMXConnector(); // Takes care of our connection 
MBeanServerConnection mbsc = jmxc.getMBeanServerConnection(); 

ObjectName mbeanName = new ObjectName("com.xyz.prodname:type=LogManager"); 

// Up to this point, the logic is the same as the working logic. In our working logic, 
// DynamicMBean is replace with our MBean interface class. 
DynamicMBean mbean = (DynamicMBean)JMX.newMBeanProxy(mbsc, mbeanName, DynamicMBean.class); 
Object o = mbean.getAttribute("AttributeNameAsItAppearsInJConsole"); 

o应该是布尔值,但它是空的。没有例外被抛出。

我也尝试了一些属性名称的其他排列,但我相信它应该是我在实现类中定义它的简单名称。

回答

2

我发现,你可以得到动态的MBean属性直接通过MBeanServerConnection对象:

JMXConnector jmxc = getJMXConnector(); // Takes care of our connection 
MBeanServerConnection mbsc = jmxc.getMBeanServerConnection(); 

ObjectName mbeanName = new ObjectName("com.xyz.prodname:type=LogManager"); 

// This change demonstrates what must be done 
Object result = mbsc.getAttribute(mbeanName, "AttributeNameAsItAppearsInJConsole"); 
1

我应该回答之前都重新加载页面。我基本上发布了原始提交者在此期间发现的内容。如果您有描述MBean管理接口(标准MBean模式)的Java接口,那么JMX.newMBeanProxy非常有用,但是如果您的MBean是动态的,那么您不需要或不需要代理。

+0

当我在写原始代码时,我错过了这个模式并专注于接口。当然,如果本教程或文档能够提供关于界面使用的更多指导,本来会很好:-) –

+0

即使对于动态MBean,似乎代理仍然有用。假设存在单独的界面,则可以在MBean的界面上定义要访问的某些/所有属性或方法。在这种情况下,您将接口传递给JMX.newMBeanProxy并返回一个实现它的实例。然后你可以在MBean上进行强类型的调用,例如getAttributeNameAsItAppearsInJConsole()或myMethod()。 请参阅[创建自定义JMX客户端]上的JMX教程页面(http://download.oracle.com/javase/tutorial/jmx/remote/custom.html)。 –