参考文献: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
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中。后面的例子会有详细介绍 |
MBean Server是一个集中的管理MBean对象实例的地方。通过MBeanServer,你可以查询、管理、操作Agent应用发布的特定的MBean。
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)控制MBean实例的
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. |
MBeanServer和MBeanServerConnection 的关系:MBeanServer扩展了MBeanServerConnection接口在Agent端,可以通过MBeanServer对象调用上述方法。在JMX client端,通过MBeanServerConnection 对象调用上述方法。
public interface MBeanServer
extends MBeanServerConnection
通过MBeanServerConnect和MBeanServer大多数方法相同。但是MBeanServer比MBeanServerConnect多了如下几类方法:
在Agent应用中,你或许可以直接获取到MBean对象的引用(因为MBean实例是在Agent端创建然后注册到MBean Server中的)。但是一般来说,都是通过MBean Server交互,获取特定的MBean 对象引用的。
MBeanServer作为一个集中式的MBean 对象管理中心,它需要一种方法来识别、区分各个不同的MBean对象。在JMX中,该方法就是为各个MBean实例取名字(Object Name)。
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。