1

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

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

查询返回我的 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 的唯一目的,因为还有另一个进程想要读取这些信息。所以我启动另一个进程来搜索这个 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");
    }
} 

但是什么都没有,没有找到bean。

项目链接:这里

任何的想法?

4

1 回答 1

2

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

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

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

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

于 2012-11-16T23:23:22.487 回答