2012-11-16 56 views
1

我有一個關於mbeans的問題。我已經創建了一個簡單的mbean,並且我已經在運行的默認mBeanServer(通過eclipse或java -jar mbean.jar)上註冊它,並且在同一個過程中,如果我試圖通過簡單的查詢註冊mbean:Mbean已註冊但未在mbean中找到服務器

for (ObjectInstance instance : mbs.queryMBeans(ObjectNameMbean, null)) { 
    System.out.println(instance.toString()); 
} 

查詢retuerns我的mbean,但如果我啓動另一個進程,並嘗試搜索此mbean註冊找不到mbeas!爲什麼?

的計算策略是:(進程正在運行)

public static void main(String[] args) throws Exception 
{ 
    MBeanServer mbeanServer =ManagementFactory.getPlatformMBeanServer(); 
    ObjectName objectName = new ObjectName(ObjectNameMbean); 
    Simple simple = new Simple (1, 0); 
    mbeanServer.registerMBean(simple, objectName); 
    while (true) 
    { 
     wait (Is this necessary?) 
    } 
} 

所以這是運行(即具有註冊表的MBean上唯一pourpose第一個過程,因爲有希望讀另一個進程這些信息 因此,我開始另一個進程來搜索這個mbean,但沒有任何東西 我沒有使用jboss,但本地Java虛擬機,但我的範圍是部署這個簡單的應用程序在一個ejb(自動啓動),另一個ejb將讀取所有信息。 所有的建議都非常感謝。

這個例子應該是比較有用:

對象你好:

public class Hello implements HelloMBean { 
    public void sayHello() { 
    System.out.println("hello, world"); 
    } 

    public int add(int x, int y) { 
    return x + y; 
    } 

    public String getName() { 
    return this.name; 
    } 


    public int getCacheSize() { 
    return this.cacheSize; 
    } 

    public synchronized void setCacheSize(int size) { 
    this.cacheSize = size; 

    System.out.println("Cache size now " + this.cacheSize); 
    } 

    private final String name = "Reginald"; 
    private int cacheSize = DEFAULT_CACHE_SIZE; 
    private static final int DEFAULT_CACHE_SIZE = 200; 
} 

接口爲helloBean(由你好實現)

public interface HelloMBean { 

    public void sayHello(); 
    public int add(int x, int y); 

    public String getName(); 

    public int getCacheSize(); 
    public void setCacheSize(int size); 
} 

簡約爲主

import java.lang.management.ManagementFactory; 
import java.util.logging.Logger; 

import javax.management.MBeanServer; 
import javax.management.ObjectName; 

public class Main { 


    static Logger aLog = Logger.getLogger("MBeanTest"); 

    public static void main(String[] args) { 

     try{ 

      MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); 

      ObjectName name = new ObjectName("ApplicationDomain:type=Hello"); 

      Hello mbean = new Hello(); 

      mbs.registerMBean(mbean, name); 

      //  System.out.println(mbs.getAttribute(name, "Name")); 
      aLog.info("Waiting forever..."); 
      Thread.sleep(Long.MAX_VALUE); 
     } 
     catch(Exception x){ 
      x.printStackTrace(); 
      aLog.info("exception"); 
     } 
    } 
} 

所以現在我有將該項目導出爲jar文件,並將其作爲「java -jar helloBean.jar」和通過eclipse我已經修改了主類讀取此讀取的信息(示例「名稱」屬性)通過使用相同的對象名用於註冊它。

主要爲:

public static void main(String[] args) { 

    try{ 

     MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); 

     ObjectName name = new ObjectName("ApplicationDomain:type=Hello"); 

     System.out.println(mbs.getAttribute(name, "Name")); 

    } 
    catch(Exception x){ 
     x.printStackTrace(); 
     aLog.info("exception"); 
    } 
} 

但沒有什麼,這個bean沒有找到。

項目鏈接:here

有什麼想法?

回答

1

我懷疑這裏的問題是,您有多個MBeanServer實例。您沒有提到在每種情況下如何獲得MBeanServer,但在第二個代碼示例中,您正在創建一個新的MBeanServer實例,該實例可能與其他線程正在讀取的實例不同。 (我想這是在同一個JVM ......)

如果您使用的是平臺代理,我建議你購買使用ManagementFactory MBeanServer的如下:

MBeanServer mbs = java.lang.management.ManagementFactory.getPlatformMBeanServer() ; 

這樣的話,你永遠獲取相同的MBeanServer實例。

+0

等等......兩個不同的jvms? – Nicholas