`
minghaitang
  • 浏览: 127049 次
社区版块
存档分类
最新评论

JMX MBeans之四Model MBean (1)

阅读更多

JMX MBeans之四Model MBean (1)

  与标准和动态MBean相比,你可以不用写MBean类,只需使用javax.management.modelmbean.RequiredModelMBean即可。RequiredModelMBean实现了ModelMBean接口,而ModelMBean扩展了DynamicMBean接口,因此与DynamicMBean相似,Model MBean的管理资源也是在运行时定义的。与DynamicMBean不同的是,DynamicMBean管理的资源一般定义在DynamicMBean中(运行时才决定管理那些资源),而model MBean管理的资源并不在MBean中,而是在外部(通常是一个类),只有在运行时,才通过set方法将其加入到model MBean中。Model MBean可以在MBean server中进行实例化,而且用户可以配置它来管理任何资源.
此外,Model MBean提供了几个特性,比如MBean的持久化以及属性值的缓存等,这些特性使得MBean变得更健壮.
  RequiredModelMBean实现ModelMBean接口.
  为了方便理解,来看看创建Model MBean的几个简单步骤:
1. 一个应用程序执行,定位JMX agent,为了通过注册一个MBean到这个agent上,从而使得自己可以被agent来管理.
2. 应用程序调用MBean Server的createMBean()方法,让它来创建一个RequiredModelMBean类的实例.
3. MBean创建好后, 程序在MBean中设置一个对象,作为被管理的资源.
4. 应用程序创建ModelMBeanInfoSupport类的一个实例, 这个对象,就像以前所提及的MBeanInfo一样,封装了这个新的Model MBean的管理接口,也就是说这个对象描述了这个被管理的资源.
5. 应用程序调用了这个新的model MBean上的方法.

Model MBean的特性:
Model MBean可以被任何JMX兼容的agent来创建, 这是个很大的优势.
有很多特性:
1. 持久化
   通过使用它的持久化机制, Model MBean可以在它所在的JMX agent的生命周期中得到存活. 每当一个Model MBean被创建的时候,它会检查判断是否从指定的位置加载了状态. 当配置一个Model MBean,你可以设置保存自身状态的间隔时间.
   这个持久化机制实现是在sun的参考实现中提供的, 通过java的对象序列化功能来把当前ModelMBeanInfo对象的状态写到一个文件中的. 当然其他比如jdbc的持久化机制也是可以实现的.
  
2. 通知记录 Notification logging
   这个特性允许Model MBean有能力对自己每个发出的通知进行记录. 当你需要对管理信息进行审计跟踪的时候,这个记录就很用.

3. 属性值缓存
   Model MBean拥有的ModelMBeanInfo对象规定了属性缓存的策略.
   比如说,策略可以这样规定,当一个属性第一次被获取的时候,可以保存在本地,下一次的访问需求可以用本地的缓存来满足. 本地的缓存值多长时间被重新更新,这个间隔时间是缓存策略规定, 用户可以来设置.
   这个能力极大提高了程序的性能. 例如,Model MBean如果管理的是一个远程资源,它就可以把属性值保存在本地,这样就避免了重复地进行远程调用来获取属性的值.
4. 操作代理
   Model MBean可以调用一个对象的接口方法,而不是直接调用被管理资源的接口.这个能力就可以让你提供方法来管理多个资源, 比如EJB, java远程对象, 或者其他对象的引用.

5. 一般通知
  Model MBean提供方法来发出一般的纯信息的通知.
 
配置Model MBean
  两个方法来配置:
1. setManagedResource(Object resource, String resoureType)
设置被管理的对象. resourceType表示这个对象引用的类型.可以取值
ObjectReference. Handle,IOR,EJBHandler, 或者 RMIReference.
2. setModelMBeanInfo(ModelMBeanInfo info)
这个参数就是描述了这个管理接口的metadata对象集合.

  由于ModelMBean接口继承了DynmicMBean接口,所以说所有的Model MBean也是Dynamic MBeans, 也就是说,所有的Model MBeans是在运行时定义它的管理接口的.不同的是Dynamic MBean是用户开发的类,必须用户构造它们自己的MBeanInfo对象来描述它们的管理接口,而Model MBean是标准的JMX类, 必须构造好它们的MBeanInfo对象,然后通过调用setModelMBeanInfo()方法来把这个info对象放到Model MBeans中去. 当管理程序得到一个MBean的MBeanInfo对象时,如果发现它是MBeanInfo的子类ModelMBeanInfoSupport的实例时,就会判定此MBean是Model MBean.

  ModelMBean继承的第二个接口是ModelMBeanNotificationBroadcaster, 这个接口声明了Model MBeans的通知处理方法.这个接口的方法可以为Model MBean的通知机制注册和取消通知监听器. 这样, Model MBeans根据配置信息可以发送属性值改变通知和其他信息型的通知.

  继承的最后一个接口是PersistentMBean. 这个接口定义了两个方法, load()和store(). load()方法试图根据ModelMBeanInfo实例中指定的位置装载MBean的状态.store()方法则是保存当前信息.

  元数据类:
ModelMBeanAttributeInfo 描述一个Model MBean的属性
ModelMBeanConstructorInfo 描述一个Model MBean的构造器
ModelMBeanNotificationInfo 描述一个Model MBean的通知
ModelMBeanOperationInfo 描述一个Model MBean的操作
ModelMBeanInfo 描述一个MBean的各种策略以及包含其他元数据对象

  使用描述符
  每个元数据对象用描述符来包含预定义的字段数据. 为了能够容纳一个Descriptor对象,每个元数据类实现了DescriptorAccess接口,这个提供了两个方法setDescritor()和getDescriptor()方法.

MBean描述符字段:
1. name   必要
2. descriptorType 必要,一般都是MBean
3. displayName  属性名称
4. persistPolicy 持久化策略
  Never(永远不保存), OnTimer(当持久化定时器到期触发保存动作,这个期限定义在persistPeriod), OnUpdate(当属性值被更新,就保存), NoMoreOfterThan(如果更新时间不是跟persistPeriod特别接近的时候就保存).这个就可以克服高度易变的数据会导致性能下降的问题), Always(和OnUpdate一样,建议使用OnUpdate)
5. persistPeriod   当persistPolicy设置为OnTimer或者NoMoreOfterThan才有效
6. persistLocation 持久化文件的路径
7. log            是否记录
8. logFile         记录文件路径
9. currencyTimeLimit 表示一个属性值有效的时间,
10.export 
11.visibility 从1到4,表示这个MBean的粒度层次,1表示最大粒度,经常会被查看的MBean,4表示最小粒度,可1能会被很少访问。
12.presentationString xml编码的字符串描述如何显示这些属性


属性描述符字段:
1. name 熟悉名
2. descriptorType 类型,通常attribute
3. value 当前属性值
4. default 如果value没值或者getMethod没有定义,将会返回此对象
5. displayName 显示名称
6. getMethod 被用来从被管理资源上获取属性值. 返回的对象保存在value字段中.
7. setMethod 被用来保存属性值.新值也会保存在value中.
8. protocolMap 这个值必须为Descriptor对象,包含了协议名称和映射的协议值对.
9. persistPolicy 类似上面的.
10.persistPeriod 类似上面的.
11.currencyTimeLimit 类似上面的.
12.lastUpdatedTimeStamp 最后一次更新的时间戳 ,为Long.toString(System.currentTimeMills())
13.visibility 整数,从1到4
14.presentationString 同上

操作描述符字段:
1. name 操作名称
2. descriptorType 通常是"operation"
3. displayName
4. value
5. currencyTimeLimit 表示值是最新,没有变旧的时间,以秒为单位
6. lastUpdatedTimeStamp
7. visibility
8. presentationString
9. targetObject
10.targetType

通知描述符字段:
1. name
2. descriptorType 通常为"notification"
3. severity 从0到6
   --0 Unknown, Indeterminate
   --1 Non recoverable
   --2 Critical, Failure
   --3 Major, Severe
   --4 Minor, Marginal, or Error
   --5 Warning
   --6 Normal, Cleared, or Informative
4. messageId
5. log
6. logFile
7. presentationString

这个例子是从sun的Example中拿出来的.
ModelAgent.java:
  - 创建一个MBean server.
  - 注册一个Model MBean到MBean server.
  - 设置Model MBean,以管理两个简单的bean,一个是TestBean, 另一个是TestBeanFriend.
  - 注册了一个类TestBeanAttributeChangeListener作为监听器,监听当TestBean中State属性改变时而发出的通知.
  - 使用Model Mbean对这两个Bean进行管理操作.

 TestBeanAttributeChangeListener.java:
  - 实现javax.management.NotificationListener接口.接受当TestBean的State值改变时由Model MBean发出的属性改变的通知.

TestBean.java:
  - 被ModelMBean管理的一个简单定义的Bean.

TestBeanFriend.java:
  - 被ModelMBean管理的一个简单定义的Bean.实现了跟TestBean相同的方法.ModelAgent测试程序使用它, 来说明和展示在同一个ModelMBean中, 如何拥有由不同对象的方法支持的多个属性.

分享到:
评论
1 楼 discolt 2012-03-06  
报错

javax.management.MBeanException: Operation addAttributeChangeNotificationListener not in ModelMBeanInfo
at javax.management.modelmbean.RequiredModelMBean.invoke(Unknown Source)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(Unknown Source)
at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(Unknown Source)
at ModelAgent.createEventListeners(ModelAgent.java:116)
at ModelAgent.doSimpleDemo(ModelAgent.java:83)
at ModelAgent.main(ModelAgent.java:59)
Caused by: javax.management.ServiceNotFoundException: Operation addAttributeChangeNotificationListener not in ModelMBeanInfo
... 6 more

相关推荐

Global site tag (gtag.js) - Google Analytics