JMXBean条目未显示

时间:2013-04-25 13:04:37

标签: java performance jmx

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

的任何值

1 个答案:

答案 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 操作。

给它一个旋转。