1

Implementation of JMXBean

PerformanceMetadata jmxBean = new PerformanceMetadata();                        
responseDocument = (Document) serviceOperation.invoke(serviceComponent,RequestDocument);
jmxBean.setNumOfRequests(1);

JMXBean class:

public class PerformanceMetadata implements PerformanceMetadataMBean{
    private int numOfRequests;
        public int getNumOfRequests() {
        return numOfRequests;
    }

    public void setNumOfRequests(int numOfRequests) {
        this.numOfRequests = numOfRequests;
    }

Class Registering the JMXBean: I call this class while booting up the server.

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);
        }

But I don't see any value for JMXBean.NumberOfRequests

4

1 回答 1

2

这里的问题是正在注册的 bean 的实例与您设置值的实例不同。因此,您需要协调传递已注册的同一实例(可选地实现为单例),或者您可以简单地使用 JMX 操作更新 MBean。还可以通过创建代理调用程序来简化执行 JMX 操作的复杂性。我建议这种方法:

  • 将NumOfRequests字段更改为AtomicInteger,因为您希望 MBean 是线程安全的[er]。IE。

  • 您的 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操作。

试一试。

于 2013-04-25T14:17:15.323 回答