2013-04-25 87 views
1

實施JMXBeanJMXBean條目沒有顯示出來

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

回答

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

給它一個旋轉。

+0

NumberOfRequest是屬性之一。我還有更多像startTime,endTime,requestType等。如何處理它們?我可以通過代理直接更新它們嗎? – 2013-04-25 14:33:08

+0

當然。只需將該字段和getter/setter添加到mbean和接口即可。 – Nicholas 2013-04-25 14:35:13