Mbean注册但未在mbean Server中找到

时间:2012-11-16 22:49:07

标签: mbeans jmx-ws

我对mbeans有疑问。我已经创建了一个简单的mbean,我已经在运行的默认mBeanServer上注册了它(通过eclipse或java -jar mbean.jar),并且在同一个过程中,如果我尝试通过一个简单的查询来注册mbean:

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

查询返回我的mbean,但如果我启动另一个进程并尝试搜索此mbean注册,则找不到mbeas!为什么呢?

approch是:(正在运行的进程)

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(由Hello实现)

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

但没有,豆子没找到。

项目链接:here

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

我怀疑这里的问题是你有多个MBeanServer实例。您没有提到在每种情况下如何获取MBeanServer,但在第二个代码示例中,您正在创建一个新的MBeanServer实例,该实例可能与其他线程正在读取的实例不同。 (我假设这一切都在一个JVM中......)

如果您使用的是平台代理,我建议您使用ManagementFactory获取MBeanServer,如下所示:

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

这样,您将始终获得相同的MBeanServer实例。

相关问题