1

mbeans に問題があります。単純な 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 仮想マシンですが、私のスコープは、この単純なアプリケーションを 1 つの 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 をどのように取得したかについては触れていませんが、2 番目のコード サンプルでは、​​他のスレッドが読み取っているインスタンスと同じではない可能性がある新しい MBeanServer インスタンスを作成しています。(これはすべて1つのJVMにあると思います...)

プラットフォーム エージェントを使用している場合は、次のようにManagementFactoryを使用して MBeanServer を取得することをお勧めします。

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

そうすれば、常に同じ MBeanServer インスタンスを取得できます。

于 2012-11-16T23:23:22.487 に答える