スタンドアロンJVMでSpringを使用したJMX MBean登録

Springのドキュメントやインターネット上のいくつかのフォーラムの設定例に続いて、私のアプリケーションコンテキストファイルは次のようになります:


    
        
            0
        
        
    
    
            
              
                    
              
            
    
    

私はコンテナなしでプレーンJVM上でこれを実行しています。 JConsole経由でプロセスに接続できますが、MBeanは表示されません。しかし、Beanをプログラムで登録すると、正常に公開されます。

MBeanServer mbeanServer = ManagementFactory.getPlatformMBeanServer();
DH dh = new DH(0);
mbeanServer.registerMBean(dh, new ObjectName("bean:name=dH1"));

私は成功せずにSpringの設定で試してみました。私は、BeanがManagementFactory.getPlatformMBeanServer()からアクセス可能な既に稼働しているMBeanサーバーに登録していないと思います。 問題に関するアイデアは?

8

2 答え

MBeanServerFactory bean( Nicholas 回答)を使用しています...


    

...あなたは MBeanExporter 管理するもの:

BeanがJMX管理インタフェースの1つを実装している場合、MBeanExporterは自動検出プロセスを通じてMBeanをサーバに登録するだけです。

     

BeanがJMX管理インタフェースのいずれかを実装していない場合、MBeanExporterは、指定されたMBeanInfoAssemblerを使用して管理情報を作成します。

あなたの abc.def.ghi.DH クラスがJMXインターフェイスを実装していないと仮定して、あなたの MBeanExporter を次のように定義してみてください:


    
        
            
                
                    getNum
                
            
        
    
    
        
            
        
    

OpenJDK 7を見て、2を更新し、ビルド21 DynamicMBean

DynamicMBean mbean = Introspector.makeDynamicMBean(object);

私はそれをデバッグしていませんが、 mbeanServer.registerMBean(dh、new ObjectName( "bean:name = dH1"))は最終的に DefaultMBeanServerInterceptor.registerObject() DynamicMBean を作成し、標準の JavaBean のプロパティのセッターとゲッターを適切に登録します。


Spring Framework 3.0.5とOracle HotSpot Java 1.6.0_24を使用して動作するいくつかのテストファイルがあります。環境変数 CLASSPATH を設定したら、 javac * .java java Main を実行し、VisualVM(または同様のアプリケーション) javaアプリケーションを使用して、登録済みのMBeanを確認します。

ac.xml:

<?xml version="1.0" encoding="UTF-8"?>

    
    
        
    
    
        
            
                
                    
                        getVal
                        setVal
                    
                
            
        
        
            
                
            
        
    

Test.java:

public class Test {
    private String val = "";
    public String getVal() {
        return val;
    }
    public void setVal(String v) {
        val = v;
    }
}

Main.java:

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
    public static void main(final String[] args) {
        ApplicationContext ac = new ClassPathXmlApplicationContext("ac.xml");
        try {
            Thread.sleep(1000 * 60 * 5);
        } catch (final Throwable t) {}
    }
}
11
追加された
この答えは今日私を助けました。 +1していただきありがとうございます。
追加された 著者 duffymo,
これは、Spring 3.0.5とgetter/setterという1つのプロパティを持つ単純なJavaBeanを使用して私のために働きます。私はVisualVMで簡単なテストアプリケーションに接続し、私が提供した MBeanExporter bean定義を使って登録されたテストMBeanを見ることができます。シンプルなフォームにシナリオを壊して、それを働かせてから、あなたが現在持っているものにバックアップして、あなたの問題がどこにあるかを見てください。
追加された 著者 Dan Cruz,
これを掘り下げてくれてありがとう@Dan。 Springのコンテキストがロードされたり、コンテキストを使ってdhが作成された場合でも、Introspectorの行は実行されません。ただし、手動でBeanを登録すると、同じ行が呼び出されます。私はSpringがこれらの設定でBeanを登録しようとしているとは思わない。何かが欠落しているはずです...
追加された 著者 Monis Iqbal,
Spring 3.1.0を使用しました。プログラムオプションとして-Dcom.sun.management.jmxremoteの有無にかかわらず提供されたXMLを試しましたが、まだ運がありません。 BeanFactory factory = new XmlBeanFactory(new ClassPathResource( "/ application-context.xml")); //新しいXmlBeanFactoryを作成します。目的のMBeanを次のようにロードします。factory.getBean(DH.class);私はこれが素朴に聞こえると知っていますが、完全なXMLと簡単なプログラム構造に一致する方法はありますか?
追加された 著者 Monis Iqbal,
大変ありがとう@ダン。それは豆が初期化されていた方法でした:|。私はBeanFactoryを使っていましたが、ApplicationContextを使ってトリックをしました。
追加された 著者 Monis Iqbal,

問題はMBeanServerFactoryBeanにあります。

javadoc から:

デフォルトでは、MBeanServerFactoryBeanは常に新しい   既に実行中のMBeanServerであっても。持っている   MBeanServerFactoryBeanは実行中のMBeanServerを最初に見つけようとしますが、   "locateExistingServerIfPossible"プロパティの値を   "true"。

この設定を試してください:


    

========================================= ==

エクスポータBeanでMBeanServerを指定してみてください:


    
        
                
            
        
        


    

========================================================================

さて、ブルートフォースのアプローチをとり、プラットフォームMBeanServerを直接取得しましょう:


    
        
                
            
        
        
            
        

2
追加された
私はすでにそれを試した@ニコラス。運がなければ再び試してみました..
追加された 著者 Monis Iqbal,
それと運がない..
追加された 著者 Monis Iqbal,
他の提案@Nicholasをありがとう。両方を試しても、MBeanは登録されませんでした。
追加された 著者 Monis Iqbal,