JMX(五)Model MBean

6467 ワード

1.Hello
Hello.JAvaは昔と同じです.ここにはMBeanインタフェースは追加されていませんが、普通のクラスです.
package jmx.modelbean;

public class Hello{
    private String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public void printHello() {
        System.out.println("Hello World, " + name);
    }
    public void printHello(String whoName) {
        System.out.println("Hello , " + whoName);
    }
} 

 2.ModelMBeanUtils
ModelMbeanUtilsというクラスは私たち自身が実現するものであり、model Beanを書くのが最も面倒な場所でもあり、主にRequiredModelMBeanクラスを返します.このようなクラスには主にModelMBeanInfoクラスの情報が含まれています.ModelMBeanInfoでは、管理する必要があるすべてのプロパティとメソッドの説明が定義されています.具体的なコードは以下の通りです.
package jmx.modelbean;

import javax.management.MBeanOperationInfo;
import javax.management.MBeanParameterInfo;
import javax.management.modelmbean.ModelMBeanAttributeInfo;
import javax.management.modelmbean.ModelMBeanInfo;
import javax.management.modelmbean.ModelMBeanInfoSupport;
import javax.management.modelmbean.ModelMBeanOperationInfo;
import javax.management.modelmbean.RequiredModelMBean;
public class ModelMBeanUtils {
    private static final boolean READABLE = true;
    private static final boolean WRITABLE = true;
    private static final boolean BOOLEAN = true;
    private static final String STRING_CLASS = "java.lang.String"; 
    public static RequiredModelMBean createModlerMBean() {
        RequiredModelMBean model = null;
        try {
            model = new RequiredModelMBean();
            model.setManagedResource(new Hello(), "ObjectReference");
            ModelMBeanInfo info = createModelMBeanInfo();
            model.setModelMBeanInfo(info);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return model;
    } 
    private static ModelMBeanInfo createModelMBeanInfo() {
        //////////////////////////////////////////////////////////////////
        //                                                                 //
        //////////////////////////////////////////////////////////////////
        //  name 
        ModelMBeanAttributeInfo nameAttrInfo = new ModelMBeanAttributeInfo(//
                "Name", //         
                STRING_CLASS, //     
                "people name", //        
                READABLE, WRITABLE, !BOOLEAN, //        
                null //  
        ); 
        //////////////////////////////////////////////////////////////////
        //                                                                 //
        //////////////////////////////////////////////////////////////////
        //  printHello()        
        ModelMBeanOperationInfo print1Info = new ModelMBeanOperationInfo(//
                "printHello", //
                null, //  
                null, //
                "void", //  
                MBeanOperationInfo.INFO, //    
                null //
        ); 
        //  printHello(String whoName)      
        ModelMBeanOperationInfo print2Info;
        MBeanParameterInfo[] param2 = new MBeanParameterInfo[1];
        param2[0] = new MBeanParameterInfo("whoName", STRING_CLASS, "say hello to who");
        print2Info = new ModelMBeanOperationInfo(//
                "printHello", //
                null,//
                param2,//
                "void", //
                MBeanOperationInfo.INFO, //
                null//
        ); 
        //////////////////////////////////////////////////////////////////
        //                                                             //
        //////////////////////////////////////////////////////////////////
        // create ModelMBeanInfo       
        ModelMBeanInfo mbeanInfo = new ModelMBeanInfoSupport(//
                RequiredModelMBean.class.getName(), // MBean 
                null, //       
                new ModelMBeanAttributeInfo[] { //  ( )
                nameAttrInfo },// 
                null, //    
                new ModelMBeanOperationInfo[] { //  ( )
                        print1Info,
                        print2Info },//
                null, //  ( )
                null//MBean 
        );
        return mbeanInfo;
    }
} 

 3.HelloAgent
続いてHelloAgentの書き方ですが、以前から「new Hello()」という言葉を削除し、ModelMbeanUtilsを加えています.createModlerMbean();
package jmx.modelbean;

import javax.management.MBeanServer;
import javax.management.MBeanServerFactory;
import javax.management.ObjectName;
import javax.management.modelmbean.RequiredModelMBean;
import com.sun.jdmk.comm.HtmlAdaptorServer;

public class HelloAgent {
	public static void main(String[] args) throws Exception {
		MBeanServer server = MBeanServerFactory.createMBeanServer();
		ObjectName helloName = new ObjectName("chengang:name=HelloWorld");
		// Hello hello = new Hello();
		RequiredModelMBean hello = ModelMBeanUtils.createModlerMBean();
		server.registerMBean(hello, helloName);
		ObjectName adapterName = new ObjectName(
				"HelloAgent:name=htmladapter,port=8082");
		HtmlAdaptorServer adapter = new HtmlAdaptorServer();
		server.registerMBean(adapter, adapterName);
		adapter.start();
		System.out.println("start.....");
	}
} 

  
4.まとめ
モデルMbean(Model MBean)が標準MBean(standard mbean)よりも複雑であることを発見しましたが、モデルMBeanを使用する理由は何ですか?最大の理由は、モデルMBeanが動的に構成できることだと思います.このアプリケーションのシーンを考えてみてください.セキュリティやその他の理由で、システムはMBeanが公開した管理可能な方法を隠します.この場合、標準MBeanを使用する場合は、インタフェースクラスを変更し、パブリケーションを再コンパイルする必要があります.Apache commons-modelerで書かれたモデルMBeanの場合は、XMLファイルを変更するだけで済み、パブリケーションを再コンパイルする必要はありません(システムを再起動する場合があります).これがモデルMbeanの強みです.
注意深い人は動的MBeanとこの節のモデルMbeanが非常に似ていることを発見しますが、それらはまだ大きな違いがあります.動的MBeanにはHelloクラスがなく、自分でHelloクラスの方法論理を実現しなければなりません.