Java Management Extensions管理扩展原理解析

所谓JMX,是Java Management Extensions(Java管理扩展)的缩写,是一个为应用程序植入管理功能的框架。用户可以在任何Java应用程序中使用这些代理和服务实现管理。

一、JMX架构图

从图中我们可以看到,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 指定是否需要密码验证

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Java基础之extends用法详解及简单实例

     Java extends用法详解 概要: 理解继承是理解面向对象程序设计的关键.在Java中,通过关键字extends继承一个已有的类,被继承的类称为父类(超类,基类),新的类称为子类(派生类).在Java中不允许多继承. (1)继承 class Animal{ void eat(){ System.out.println("Animal eat"); } void sleep(){ System.out.println("Animal sleep"); } vo

  • Java中extends一定是代表继承吗?

    Java中继承用哪个关键字表示?extends!没错,这是Java小学生都知道的常识.可是extends有没有别的含义呢?它在任何情况下都一定代表继承吗?不一定. 我们知道Collections类有静态方法sort,用于List的排序,该方法要求List中的元素类必须实现Comparable接口.我们来看看源码: ... @SuppressWarnings("unchecked") public static <T extends Comparable<? super T&

  • java中extends与implements的区别浅谈

    1. 在类的声明中,通过关键字extends来创建一个类的子类.一个类通过关键字implements声明自己使用一个或者多个接口.extends 是继承某个类, 继承之后可以使用父类的方法, 也可以重写父类的方法; implements 是实现多个接口, 接口的方法一般为空的, 必须重写才能使用2.extends是继承父类,只要那个类不是声明为final或者那个类定义为abstract的就能继承,JAVA中不支持多重继承,但是可以用接口 来实现,这样就要用到implements,继承只能继承一个

  • Java继承extends与super关键字详解

    函数也称为方法! 继承:在java中使用extends关键字来表示继承关系.super用来继承父类方法和参数. 继承就是子类继承父类的特征和行为,使得子类具有父类相同的行为. 注意事项: 1.当一个类没有继承任何一个类时,系统默认继承Object. 2.父类又被称为基类.超类.super类,子类又被称为派生类,这是由于翻译问题而导致的. 3.Java的继承是单一性的. 4.子类不能继承父类的构造方法,但是可以继承构造方法类的参数. 5.子类可以拥有自己的属性和方法,即子类可以对父类进行扩展.但子

  • Java泛型extends关键字设置边界的实现

    本文主要介绍在泛型定义中的< >中的占位符如何配合extends关键字使用,形如<T extends Integer>.泛型定义存在于这三种形式中:泛型类.泛型接口.泛型方法. 一般的泛型定义中的<T>,相当于<T extends Object>,而类型擦除则会将类型参数擦除成T的上界,即Object.则在泛型定义中作为T类型的对象可以调用Object的函数和属性. 使用了extends的泛型定义中的<T extends Integer>,其上界

  • 详解JAVA中implement和extends的区别

    详解JAVA中implement和extends的区别 extends是继承父类,只要那个类不是声明为final或者那个类定义为abstract的就能继承,Java中不支持多重继承,但是可以用接口来实现,这样就要用到implements,继承只能继承一个类,但implements可以实现多个接口,用逗号分开就行了比如class A extends B implements C,D,E implements是一个类实现一个接口用的关键字,他是用来实现接口中定义的抽象方法. 还有几点需要注意: (1

  • Java Management Extensions管理扩展原理解析

    所谓JMX,是Java Management Extensions(Java管理扩展)的缩写,是一个为应用程序植入管理功能的框架.用户可以在任何Java应用程序中使用这些代理和服务实现管理. 一.JMX架构图 从图中我们可以看到,JMX的结构一共分为三层: 1. 基础层:主要是Mbean,被管理的java bean Mbean分为如下四中 类型 描述 standard MBean 这种类型的MBean最简单,它能管理的资源(包括属性,方法,时间)必须定义在接口中,然后MBean必须实现这个接口.

  • Java三种移位运算符原理解析

    这篇文章主要介绍了Java三种移位运算符原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 java移位运算符不外乎就这三种:<<(左移).>>(带符号右移)和>>>(无符号右移). 1. 左移运算符 左移运算符<<使指定值的所有位都左移规定的次数. 1)它的通用格式如下所示: value << num num 指定要移位值value 移动的位数. 左移的规则只记住一点:丢弃最高位(符

  • java同步器AQS架构AbstractQueuedSynchronizer原理解析下

    目录 引导语 1.释放锁 1.1.释放排它锁release 1.2.释放共享锁releaseShared 2.条件队列的重要方法 2.1.入队列等待await 2.1.1.addConditionWaiter 2.1.2.unlinkCancelledWaiters 2.2.单个唤醒signal 2.3.全部唤醒signalAll 3.总结 引导语 AQS 的内容太多,所以我们分成了两个章节,没有看过 AQS 上半章节的同学可以回首看一下哈,上半章节里面说了很多锁的基本概念,基本属性,如何获得锁

  • java同步器AQS架构AbstractQueuedSynchronizer原理解析

    目录 引导语 1.整体架构 1.1.类注释 1.2.类定义 1.3.基本属性 1.3.1.简单属性 1.3.2.同步队列属性 1.3.3.条件队列的属性 1.3.4.Node 1.3.5.共享锁和排它锁的区别 1.4.Condition 2.同步器的状态 3.获取锁 3.1.acquire排它锁 3.1.1.addWaiter 3.1.2.acquireQueued 3.2.acquireShared获取共享锁 4.总结 引导语 AbstractQueuedSynchronizer 中文翻译叫做

  • Java流程控制顺序结构原理解析

    这篇文章主要介绍了Java流程控制顺序结构原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 流程控制的概念 在一个程序执行的过程中,各条语句的执行顺序对程序的结果是有直接影响的.也就是说,程序的流程对运行结果有直接的影响.所以,我们必须清楚每条语句的执行流程.而且,很多时候我们要通过控制语句的执行顺序来实现我们要完成的功能. 流程控制之顺序结构 根据代码的编写顺序,从上往下,依次执行. 顺序结构之流程图 ​ 需求 举例说明顺序结构的执行

  • Java方法覆盖重写实现原理解析

    这篇文章主要介绍了Java方法覆盖重写实现原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 方法覆盖重写注意事项: 1.必须保证方法名相同,返回值也相同 @Override:写在方法前面,用来检测方法的覆盖重写是否有效,这个注解不是必要的,就算不写,方法覆盖重写符合要求也是正确的 2.子类方法的返回值必须[小于等于]父类方法的返回值 3.子类方法的修饰符必须[大于等于]父类方法的修饰符 继承关系中,父子类构造方法的访问特点: 1.子类构造

  • java instanceof操作符使用及原理解析

    这篇文章主要介绍了java instanceof操作符使用及原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 a intanceof A:判断a是否是类A的的一个实例,返回值为boolean public class Person extends Object{} public class Student extends Person{} public class Graduate extends Person{} public clas

  • Java枚举类接口实例原理解析

    这篇文章主要介绍了Java枚举类接口实例原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 枚举类可以实现一个或多个接口.与普通类实现接口完全一样,枚举类实现接口时,需要实现该接口所包含的方法. 如果需要每个枚举值在调用同一个方法时呈现不同的行为,则可以让每个枚举值在{...}匿名块中实现自己的业务逻辑. public interface IGradeHandler { String getGrade(String studentName)

  • Java日期与时间类原理解析

    这篇文章主要介绍了Java日期与时间类原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 基础知识 日期: 类似于 2018-12-12 时间: 类似于 2018-12-12 12:12:12 时刻: 类似于 2018-12-12 12:12:12 地区: 计算机中的 Locale, 如 zh_CN, en_US 等, 影响着对于日期, 时间, 货币等格式的显示 EpochTime: 从 1970 年 1 月 1 日 UTC+00:00 到

  • Java基础异常处理代码及原理解析

    这篇文章主要介绍了java基础异常处理代码及原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 异常的定义:中断了正常指令流的事件. try..catch..finally结构: class Test{ public static void main(String[] args){ System.out.println(1); try{ System.out.println(2); int i = 1 / 0; System.out.pri

随机推荐