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
的任何值答案 0 :(得分:2)
这里的问题是被注册的bean的实例与您设置值的实例不同。因此,您需要协调传递已注册的同一实例(可选地实现为单例),或者您可以使用JMX操作简单地更新MBean。通过创建代理调用程序也可以简化执行JMX操作的复杂性。我建议采用这种方法:
将 NumOfRequests 字段更改为AtomicInteger,因为您要使MBean线程安全[er]。即
你的MBean和接口应该有一个属性访问器(一个getter)和一个增量器。
<强>接口强>
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的 incrementNumOfRequests 操作。
给它一个旋转。