1. 程式人生 > 程式設計 >Java Management Extensions管理擴充套件原理解析

Java Management Extensions管理擴充套件原理解析

所謂JMX,是Java Management Extensions(Java管理擴充套件)的縮寫,是一個為應用程式植入管理功能的框架。使用者可以在任何Java應用程式中使用這些代理和服務實現管理。

一、JMX架構圖

Java Management Extensions管理擴充套件原理解析

從圖中我們可以看到,JMX的結構一共分為三層:

1、 基礎層:主要是Mbean,被管理的java bean

Mbean分為如下四中

型別 描述
standard MBean 這種型別的MBean最簡單,它能管理的資源(包括屬性,方法,時間)必須定義在介面中,然後MBean必須實現這個介面。它的命名也必須遵循一定的規範,例如我們的MBean為Hello,則介面必須為HelloMBean。
dynamic MBean 必須實現javax.management.DynamicMBean介面,所有的屬性,方法都在執行時定義
model MBean 與標準和動態MBean相比,你可以不用寫MBean類,只需使用javax.management.modelmbean.RequiredModelMBean即可。RequiredModelMBean實現了ModelMBean介面,而ModelMBean擴充套件了DynamicMBean介面,因此與DynamicMBean相似,Model MBean的管理資源也是在執行時定義的。與DynamicMBean不同的是,DynamicMBean管理的資源一般定義在DynamicMBean中(執行時才決定管理那些資源),而model MBean管理的資源並不在MBean中,而是在外部(通常是一個類),只有在執行時,才通過set方法將其加入到model MBean中。

2、適配層:MbeanServer,提供對資源的註冊和管理

3、接入層: 提供遠端訪問的入口

二、standard MBean演示

1、根據standard MBean的要求,我們首先要定義一個MBean介面,介面的命名規範以具體的實現類為字首,為了後續可以註冊到

MBean Server中

package jmx;
public interface HelloMBean
{
   public String getName();    
   public void setName(String name);    
   public String getAge();
   public void setAge(String age);    
   public void helloWorld();    
   public void helloWorld(String str);    
   public void getTelephone();
}

2、定義一個實現類

package jmx;

/*
 * 該類名稱必須與實現的介面的字首保持一致(即MBean前面的名稱
 */
public class Hello implements HelloMBean
{
  private String name;
    
  private String age;

  public void getTelephone()
  {
    System.out.println("get Telephone");
  }

  public void helloWorld()
  {
    System.out.println("hello world");
  }

  public void helloWorld(String str)
  {
    System.out.println("helloWorld:" + str);
  }

  public String getName()
  {
    System.out.println("get name 123");
    return name;
  }

  public void setName(String name)
  {
    System.out.println("set name 123");
    this.name = name;
  }

  public String getAge()
  {
    System.out.println("get age 123");
    return age;
  }

  public void setAge(String age)
  {
    System.out.println("set age 123");
    this.age = age;
  }   
}

3、定義agent層

package jmx;

import java.lang.management.ManagementFactory;

import javax.management.JMException;
import javax.management.MBeanServer;
import javax.management.ObjectName;

public class HelloAgent
{
  public static void main(String[] args) throws JMException,Exception
  {
     MBeanServer server = ManagementFactory.getPlatformMBeanServer();
     ObjectName helloName = new ObjectName("jmxBean:name=hello");
     //create mbean and register mbean
     server.registerMBean(new Hello(),helloName);
     Thread.sleep(60*60*1000);
  }
}

1、 通過工廠類獲取Mbean Server,用來做Mbean的容器

2、 ObjectName的取名規範:域名:name=Mbean名稱,其中域名和Mbean的名稱可以任取。這樣定義後,我們可以唯一標示我們定義的這個Mbean的實現類了

3、最後將Hello這個類註冊到MbeanServer中,注入需要建立一個ObjectName類,我們可以用jdk自帶的Jconsole用來觀察,可以設定屬性值和呼叫相關方法。

三、Notification

MBean之間的通訊是必不可少的,Notification起到了在MBean之間溝通橋樑的作用。JMX 的通知由四部分組成:

1、Notification這個相當於一個資訊包,封裝了需要傳遞的資訊

2、Notification broadcaster這個相當於一個廣播器,把訊息廣播出。

3、Notification listener 這是一個監聽器,用於監聽廣播出來的通知資訊。

4、Notification filiter 這個一個過濾器,過濾掉不需要的通知。這個一般很少使用。保留Hello及HelloMBean,增加如下

package jmx;

public interface JackMBean
{
  public void hi();
}
package jmx;

import javax.management.Notification;
import javax.management.NotificationBroadcasterSupport;

public class Jack extends NotificationBroadcasterSupport implements JackMBean
{
  private int seq = 0;
  public void hi()
  {
     //建立一個資訊包
    Notification notify = 
      //通知名稱;誰發起的通知;序列號;發起通知時間;傳送的訊息
      new Notification("jack.hi",this,++seq,System.currentTimeMillis(),"jack");
    sendNotification(notify);
  }

}

這裡的類Jack不僅實現了MBean介面,還繼承了NotificationBroadcasterSupport。jack在這裡建立併發送了一個訊息包。

package jmx;
import javax.management.Notification;
import javax.management.NotificationListener;
public class HelloListener implements NotificationListener
{
  public void handleNotification(Notification notification,Object handback)
  {
    if(handback instanceof Hello)
    {
      Hello hello = (Hello)handback;
      hello.printHello(notification.getMessage());
    }
  }
}

對HelloAgent做以下修改

package jmx;

import java.lang.management.ManagementFactory;

import javax.management.JMException;
import javax.management.MBeanServer;
import javax.management.ObjectName;

public class HelloAgent
{
  public static void main(String[] args) throws JMException,Exception
  {
    MBeanServer server = ManagementFactory.getPlatformMBeanServer();
    ObjectName helloName = new ObjectName("yunge:name=Hello");  
    Hello hello=new Hello();     
    server.registerMBean(hello,helloName); 
    Jack jack = new Jack();
    server.registerMBean(jack,new ObjectName("jack:name=Jack"));
    jack.addNotificationListener(new HelloListener(),null,hello);
    Thread.sleep(500000);
  }
}

我們利用jconsole呼叫jack的hi方法,這裡當jack發出訊息後,Notification被廣播至所有的MBean,當有MBean屬於Hello類時則呼叫Hello的printHello()方法。

四、JMX的應用

在linux下利用jmx監控Tomcat,在catlina.sh中進行一些環境變零的配置

配置 功能
Dcom.sun.management.jmxremote=true 相關 JMX 代理偵聽開關
Djava.rmi.server.hostname 伺服器端的IP
Dcom.sun.management.jmxremote.port=29094 相關 JMX 代理偵聽請求的埠
Dcom.sun.management.jmxremote.ssl=false 指定是否使用 SSL 通訊
Dcom.sun.management.jmxremote.authenticate=false 指定是否需要密碼驗證

Java Management Extensions管理擴充套件原理解析

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。