JMXBean的实现
PerformanceMetadata jmxBean = new PerformanceMetadata();
responseDocument = (Document) serviceOperation.invoke(serviceComponent,RequestDocument);
jmxBean.setNumOfRequests(1);
JMXBean类:
public class PerformanceMetadata implements PerformanceMetadataMBean{
private int numOfRequests;
public int getNumOfRequests() {
return numOfRequests;
}
public void setNumOfRequests(int numOfRequests) {
this.numOfRequests = numOfRequests;
}
注册JMXBean的类:我在启动服务器时调用该类。
public class JMXBeans {
public void registerJMXBeans()
{
MBeanServer mbs = null;
PerformanceMetadata metadataObj = null;
ObjectName name;
try
{
metadataObj = new PerformanceMetadata();
mbs = ManagementFactory.getPlatformMBeanServer();
name = new ObjectName("test.performace:type=PerformanceMetadataMBean");
mbs.registerMBean(metadataObj, name);
}
但是我看不到JMXBean.NumberOfRequests的任何值
最佳答案
这里的问题是,正在注册的Bean实例与您要为其设置值的实例不同。因此,您需要协调传递已注册的同一实例(可以选择实现为单例),也可以使用JMX操作简单地更新MBean。创建代理调用程序也可以简化执行JMX操作的复杂性。我建议这种方法:
因为您想使MBean线程安全[er],所以将NumOfRequests字段更改为AtomicInteger。即。
您的MBean和接口应具有属性访问器(获取器)和增量器。
接口
public int getNumOfRequests();
public void incrementNumOfRequests(int requests);
实作
private final AtomicInteger numOfRequests = new AtomicInteger(0);
public int getNumOfRequests() {
return numOfRequests.get();
}
public void incrementNumOfRequests(int requests) {
numOfRequests.addAndGet(requests);
}
现在,您可以注册一次bean实例,并通过可即时生成的JMX代理对其进行更新。这是使用MBeanServerInvocationHandler完成的。
PerformanceMetadataMBean proxy = (PerformanceMetadataMBean)MBeanServerInvocationHandler.newProxyInstance(ManagementFactory.getPlatformMBeanServer(),
new ObjectName("test.performace:type=PerformanceMetadataMBean"),
PerformanceMetadataMBean.class,
false);
现在,当您调用
proxy.incrementNumOfRequests(14)
时,它实际上是在调用Bean的crementNumOfRequests操作。旋转一下。
关于java - JMXBean条目未显示,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16215527/