Java JMX 二:MBean and MBean Server

参考文献:https://docs.oracle.com/cd/E19698-01/816-7609/index.html
相关文章:
Java JMX 一:初步认识:https://blog.csdn.net/youyou1543724847/article/details/82933076

Java JMX 三:Connector:https://blog.csdn.net/youyou1543724847/article/details/84300557

文章目录

  • 1.MBean
  • 2.MBeanServer
    • 2.1 关于MbeanServer
    • 2.2 MBeanServer接口
    • 2.3 MBeanServer与MBeanServerConnection
  • 3.引用MBeans
    • 3.1 ObjectName

1.MBean

MBean分为如下四种

类型 描述
standard MBean 这种类型的MBean最简单,它能管理的资源(包括属性,方法,时间)必须定义在接口中,然后MBean必须实现这个接口。它的命名也必须遵循一定的规范,例如我们的MBean为Hello,则接口必须为HelloMBean。
dynamic MBean 必须实现javax.management.DynamicMBean接口,所有的属性,方法都在运行时定义
open MBean 此MBean的规范还不完善,正在改进中
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

MBean Server是一个集中的管理MBean对象实例的地方。通过MBeanServer,你可以查询、管理、操作Agent应用发布的特定的MBean。

2.1 关于MbeanServer

MBeanServer一般通过MBeanServerFactory来创建

只有JMX 兼容的MBean对象才能注册到MBeanServer中。当MBean对象注册到MBeanServer对象后,该对象的属性和方就是远程可访问的了(通过JMX connector或是Adapter)

(1) Mbean注册
当MBean注册或是取消注册后,MBeanServer发出 MBeanServerNotification Notification 。

(2)关于安全检查
使用MBeanServerFactory 的createMBeanServer 或newMBeanServer 方法得到的MBeanServer具有安全检查机制。

如果不存在SecurityManager(即(System.getSecurityManager()结果为null),则MBeanServer可以不做任何检查。

如果存在SecurityManager,或是MbeanServer接口的实例类想要进行安全检查(即要么使用SecurityManager实现的默认安全检测,或是你自己实现,但是基本规则需要符合规范,规范如下),则检测的规则如下:

  1. 如果安全检查失败,则抛出SecurityException异常;
  2. 对于会抛出 InstanceNotFoundException的方法,不管权限如何,当存储MBean时,还是应该抛出InstanceNotFoundException异常;
  3. 对于invoke方法,调用者必须具有如下权限:MBeanPermission(className, operationName, name, “invoke”).
  4. 对应getAttribute放,调用者必须具有如下权限:MBeanPermission(className, attribute, name, “getAttribute”).

2.2 MBeanServer接口

主要包括如下几类操作接口:
(1)控制MBean实例的

  1. createMBean, or instantiate and registerMBean :增加MBean到Agent中
  2. unregisterMBean :从Agent中删除MBean;
  3. addNotificationListener and removeNotificationListener :MBean的事件监听操作
  4. classloader相关的

MBeanServerConnect接口中的相关的方法列表

Modifier and Type Method Description
ObjectInstance createMBean(String className, ObjectName name) Instantiates and registers an MBean in the MBean server.
ObjectInstance createMBean(String className, ObjectName name, Object[] params, String[] signature) Instantiates and registers an MBean in the MBean server.
ObjectInstance createMBean(String className, ObjectName name, ObjectName loaderName) Instantiates and registers an MBean in the MBean server.
ObjectInstance createMBean(String className, ObjectName name, ObjectName loaderName, Object[] params, String[] signature) Instantiates and registers an MBean in the MBean server.
void unregisterMBean(ObjectName name) Unregisters an MBean from the MBean server.
ObjectInstance getObjectInstance(ObjectName name) Gets the ObjectInstance for a given MBean registered with the MBean server.
boolean isInstanceOf(ObjectName name, String className) Returns true if the MBean specified is an instance of the specified class, false otherwise.
boolean isRegistered(ObjectName name) Checks whether an MBean, identified by its object name, is already registered with the MBean server.
void addNotificationListener(ObjectName name, NotificationListener listener, NotificationFilter filter, Object handback) Adds a listener to a registered MBean.
void addNotificationListener(ObjectName name, ObjectName listener, NotificationFilter filter, Object handback) Adds a listener to a registered MBean.
void removeNotificationListener(ObjectName name, NotificationListener listener) Removes a listener from a registered MBean.
void removeNotificationListener(ObjectName name, NotificationListener listener, NotificationFilter filter, Object handback) Removes a listener from a registered MBean.
void removeNotificationListener(ObjectName name, ObjectName listener) Removes a listener from a registered MBean.
void removeNotificationListener(ObjectName name, ObjectName listener, NotificationFilter filter, Object handback) Removes a listener from a registered MBean.

(2)访问Mbean属性和操作的:
5. getMBeanInfo
6. getAttribute and getAttributes
7. setAttribute and setAttributes
8. invoke

MBeanServerConnect接口中的相关的方法列表

Modifier and Type Method Description
Object getAttribute(ObjectName name, String attribute) Gets the value of a specific attribute of a named MBean.
AttributeList getAttributes(ObjectName name, String[] attributes) Retrieves the values of several attributes of a named MBean.
String[] getDomains() Returns the list of domains in which any MBean is currently registered.
MBeanInfo getMBeanInfo(ObjectName name) This method discovers the attributes and operations that an MBean exposes for management.
Object invoke(ObjectName name, String operationName, Object[] params, String[] signature) Invokes an operation on an MBean.
void setAttribute(ObjectName name, Attribute attribute) Sets the value of a specific attribute of a named MBean.
AttributeList setAttributes(ObjectName name, AttributeList attributes) Sets the values of several attributes of a named MBean.

(3)查询管理agent中mbean整体情况的:
10. getDefaultDomain
11. getMBeanCount
12. queryMBeans、queryNames:通过name或value查找beam.

MBeanServerConnect接口中的相关的方法列表

Modifier and Type Method Description
Integer getMBeanCount() Returns the number of MBeans registered in the MBean server.
String getDefaultDomain() Returns the default domain used for naming the MBean.
Set queryMBeans(ObjectName name, QueryExp query) Gets MBeans controlled by the MBean server.
Set queryNames(ObjectName name, QueryExp query) Gets the names of MBeans controlled by the MBean server.

2.3 MBeanServer与MBeanServerConnection

在Agent端,可以通过MBeanServer对象调用上述方法。在JMX client端,通过MBeanServerConnection 对象调用上述方法。

MBeanServer和MBeanServerConnection 的关系:MBeanServer扩展了MBeanServerConnection接口
public interface MBeanServer
extends MBeanServerConnection

通过MBeanServerConnect和MBeanServer大多数方法相同。但是MBeanServer比MBeanServerConnect多了如下几类方法:

3.引用MBeans

在Agent应用中,你或许可以直接获取到MBean对象的引用(因为MBean实例是在Agent端创建然后注册到MBean Server中的)。但是一般来说,都是通过MBean Server交互,获取特定的MBean 对象引用的。

MBeanServer作为一个集中式的MBean 对象管理中心,它需要一种方法来识别、区分各个不同的MBean对象。在JMX中,该方法就是为各个MBean实例取名字(Object Name)。

3.1 ObjectName

https://docs.oracle.com/javase/8/docs/api/javax/management/ObjectName.html

基本形式:DomainName:property=value[,property2=value2]*

MBean注册到MBean Server中。MBean Server通过object name来对mbean进行区分。同一个MBean类可能有多个实例对象,但是每个实例对象都有一个唯一的objectname。

DomainName是一个抽象的类别,用于将MBean进行分类。该类别可以是任何的字符串(具有的意义是你自己根据MBean的业务逻辑取名的),如test,hadoop等。同理,property Key也可以是任意的字符串。一个ObjectName名至少有一个property key。

MBean server 中至少有一个Dommain。当Mbean的dommain无关紧要时,mbean server提供默认的dommain(叫做DefaultDomain)

注意:同一个MBean 类可能会实例化多个MBean对象实例,但是不同的对象实例必须有不同的唯一的object name。

你可能感兴趣的:(JAVA,大数据,分布式)