【JMX】8. JBossでのJMX実装

5706 ワード

前はJDKが持参したJMX実装で書いたMBeanですが、JMXの実装はSUN一家だけでなく、JBOSSにも独自のJMX実装があります.JBOSSを使ってWEBサーバを作るなら、JBOSSの実装に基づいてMBeanを書くのはいい選択です.JBossベースのMBeanとSUNベースのMBeanは何か違いがありますか?いくつかの違いがありますが、ほとんどは同じです.
 
 
HelloWorldインスタンス
1、準備
JBOSSはJMX仕様を実現し、この例はJBOSSに基づいて実現される.まずJBOSSをダウンロードしてください.私はjboss-3.2.6です.ダウンロードアドレス:http://www.jboss.com/downloads/index#as.この例では、JBOSSの2つのJARパッケージのサポートが必要です.
jboss-system-3.2.6.jar
(jboss-system-jmx.jar?)、jboss-jmx-3.2.6.jar、もしあなたが私と同じようにEclipseで開発(推奨)すれば、この2つのパッケージをプロジェクトのライブラリリファレンスに追加します.
2、プログラムコード
メッセージという属性が常に構成を変更する必要があると仮定すると、MBeanと書きます.
1)HelloWorldServiceMBeanインタフェース
MBeanを書く前に、私たちはまずMBeanインタフェースを書く必要があります.インタフェースの方法はすべて属性のset/get方法です.このインタフェースは、インタフェースServiceMBeanを継承する必要があります.
    import org.jboss.system.ServiceMBean;   
    public interface HelloWorldServiceMBean extends ServiceMBean {   
        String getMessage();   
        void setMessage(String message);   
    }  


2)HelloWorldService実装クラス
次に、HelloWorldServiceMBeanインタフェースの実装クラスHelloWorldServicesと書きます.この実装クラスは、ServiceMBeanSupportクラスを継承する必要があります.このクラスは簡単で、属性と対応するset/getメソッドで、EJBでは実体クラス、HibernateではPOJOと呼ばれています.
    import org.jboss.system.ServiceMBeanSupport;   
    public class HelloWorldService extends ServiceMBeanSupport 
                                   implements HelloWorldServiceMBean {   
        private String message;  
        @Override 
        public String getMessage() {   
            System.out.println("getMessage()=" + message);   
            return message;   
        } 
        @Override
        public void setMessage(String message) {   
            System.out.println("setMessage(" + message + ")");   
            this.message = message;   
        }   
    }   

——コンパイルエラー;ここにはjboss-microcontainerが必要です.jar;ここでダウンロードできます.http://www.java2v.com/Code/Jar/JKL/Downloadjbossmicrocontainerjar.htm新しいエラー:The type org.jboss.mx.util.JBossNotificationBroadcasterSupport cannot be resolved. It is indirectly referenced from required .class filesインポートjboss-jmx-4.2.3.GA.jarの後:The hierarchy of the type HelloWorldService is inconsistent--JBossバージョンの問題かもしれませんが、保留します.3
)プロファイルjboss-service.xml
    <?xml version="1.0" encoding="UTF-8"?>  
    <server>  
        <mbean code="example.mbean.HelloWorldService"
               name="www.chengang.com.cn:service=HelloWorld">  
            <attribute name="Message">Hello World</attribute>  
        </mbean>  
    </server>   

説明:
l code項はMBeanの実装クラスHelloWorldServiceを指す
l name項目は名前で、フォーマットは一般的に:[説明文字]:service=[クラス名]
l attributeは、JBOSSがHelloWorldServiceクラスをロードすると、message属性に初期値Hello Worldが設定されるように、属性の初期値を設定します.
注意Messageの最初のアルファベットは大文字でなければなりません.
インスタンスをJBOSSに配備
jbossserverdefaultdeployディレクトリの下にhelloを作成します.sarディレクトリを作成し、次のディレクトリファイル構造を作成します.
hello.sar
|----example
|
            |----mbean |
                    |----HelloWorldService.class(注意:はい*.class、いいえ*.java)
|
                    |----HelloWorldServiceMBean.class |----META-INF
             |----jboss-service.xml
その他の説明:
l hello.sarディレクトリはzip形式で同名のhelloに圧縮されます.sarファイル、jbossserverdefaultdeployディレクトリの下に配置します.
l JBOSSはホットな導入をサポートしています.つまり、このディレクトリを配置するときにJBOSSを再起動する必要はありません.
MBeanの効果
Webサイトを開く:http://127.0.0.1:8080/jmx-console/ 
「サービス=HelloWorld」をクリックして詳細ページを開きます
「Hello World」を「Hello World,ChenGang」に変更し、「Apply Changes」をクリックして変更を適用
その他のクラスでMessagプロパティの使用方法
自動的に提供されるWEBページでMessageプロパティを設定できるようになりました.次の問題は、「他のクラスでMessageのプロパティ値をどのように得るべきか」です.MBeanはJBossでは1つのMBeanのみを保持するインスタンス(単例モード?)であり、つまり、問題は私たちがこの唯一の例をどのように取得するかに変わります.インスタンスは次のとおりです.
1、Message属性を使用するクラスを作成する
    import org.jboss.mx.util.MBeanProxyExt;   
    import org.jboss.mx.util.ObjectNameFactory;   
    public class Client {   
        public void go() {   
            HelloWorldServiceMBean mbean = (HelloWorldServiceMBean) MBeanProxyExt
                .create(HelloWorldServiceMBean.class, 
                ObjectNameFactory.create(www.chengang.com.cn:service=HelloWorld));   
            String msg = mbean.getMessage();   
            System.out.println("Client.go()=" + msg);   
        }   
    }    

注意:goメソッドには3つの文があります.最初の文はjboss-serviceに基づいて長いです.xmlファイルに設定されているMBeanの名前で、このMBeanのJBOSSでのインスタンスを取得します.
2、Mbeanに相応の呼び出しClientを追加する.goの方法
HelloWorldServiceMBeanインタフェースに次の文を追加します.
 void callGo();  

にある
HelloWorldService
クラスに現実的なメソッドを追加するには、次の手順に従います.
 public void callGo() {   
     new Client().go();   
 }  

3
、布署の更新
3つのクラスのclassファイル:Clien.class、HelloWorldServiceMBean.class、HelloWorldService.class,更新到JBOSS的hello.sarexamplembeanディレクトリの下にあります.そしてJBOSSを再起動します.
4、効果を見る
JBOSSが提供するMBean設定ページを開くと、callGoが1つ増えています.
callGoアイテムのinvokeボタンをクリックし、DOS出力を取得
その他の説明
  • この例では、Messageプロパティを1つしか示していません.もちろん、HelloWorldServiceに追加することができます.HelloWorldServiceMBeanインタフェースにも対応するset/getメソッドを追加することを忘れないでください.
  • この例のメッセージ属性はStringタイプであるが、JMXは他のタイプ、さらにはXML情報もサポートする.jboss-serviceの場合.xmlのXML情報は、属性タイプがorgであることが要求する.w3c.dom.Element,JMXはそれをXMLのDOMオブジェクトにカプセル化する.
  • 振り返ると、JMXもプロファイル情報を1つのファイル(jboss-service.xmlファイル)に書いたのか、プロファイルを*に書くことに対して.propertiesファイルの仕方は、新鮮な場所もないようです.しかし、この章の例では、コードを書いてプロファイルの情報を読む必要がなく、JMXがサポートするプロパティのタイプが多様である(org.w 3 c.dom.Elementなど)JMXのメリットを見ることができます.さらに重要なのは、JMXが属性を相互にアクセスし、相互に呼び出す機能を提供していることであり、このHelloWorldインスタンスは氷山の一角を反映しているだけである.