技术开发 频道

Pico\JMX\微容器以及对象的易管理性

【IT168 技术文档】

  一个新概念正在暗流涌动:PicoContainer/NanoContainer(以下简称pico)这样微容器正日益受到关注和广泛应用;J2SE5.0将JMX作为JDK基本API,这些技术都表明对象的易管理性(application/object manageability)呼之欲出。

  本文试图比较Pico、JMX这两种基于组件的容器管理技术,探讨对象易管理性方面的一些实践问题和模式。

  对象易管理性中首先是被管理的对象,也称为容器的基本模型单元,在JMX中它是Mbean;而在pico中则是普通Java对象,后者比前者更加广泛,也说明两者可结合使用。


  JMX和Pico

  我们进一步看看JMX的MBean特性和pico:

  1. 在JMX中,业务对象只要继承MBean接口就能够被纳入被管理范围。这些接口包括Standard MBean, DynamicMBean 或者 ModelMBean ,不同的MBean有不同的规则。而业务对象只要是Object,就可纳入Pico的容器管理范围,因此,pico可以做JMX最外层的套子。

  2.在JMX中,MBean只能通过MBean server访问;同样,在pico中,外界只能通过容器访问其中的Object。

  3.MBeans能向MBean Server注册,以一个唯一的字符串名,而在pico中也是如此,并且,pico不要求直接实例注册,而是推荐以Class注册,并且能够自动寻找Class需要的构造参数,可见,pico在这里增强了组件注册功能。

  4.调用Mbean的方法也很特别,只需MBean名称和方法名称组合的字符串就可以,最后通过invoke调即可; 在pico中,从容器中调用对象也是以String型的key实现调用,pico是以字符串调用对象;jmx是以字符串调用对象的方法; 两者可结合使用,关于字符串调用,pico增强容器NanoContainer甚至可以通过任何语言编制的字符串脚本都可以(smell like LOP面向语言编程?或者称为面向容器编程?)。

  JMX和pico结合比较调用实例如下:

Reader script = new StringReader("" + "import org.nanocontainer.script.groovy.NanoContainerBuilder\n" + "import org.microcontainer.jmx.JmxDecorationDelegate\n" + "\n" + "builder = new NanoContainerBuilder(new JmxDecorationDelegate())\n" + "pico = builder.container() {\n" + " component(key:javax.management.MBeanServer, instance:javax.management.MBeanServerFactory.createMBeanServer())\n" + " component(key:org.nanocontainer.testmodel.Wilma, class:org.nanocontainer.testmodel.WilmaImpl) {\n" + " jmx(key:'domain:wilma=default', operations:['helloCalled'], description:'jmx description text')\n" + " }\n" + "}");
  script是一段Groovy脚本,这段脚本是向Pico注册一个MBeanServer,并且向MBeanServer中注册一个MBean:接口是org.nanocontainer.testmodel.Wilma;实现是org.nanocontainer.testmodel.WilmaImpl,代码如下:
public interface Wilma {   void hello(); } public class WilmaImpl implements Wilma {   private boolean helloCalled;   public boolean helloCalled() {     return helloCalled;   }   public void hello() {     helloCalled = true;   } }
  NanoContainer可以运行装载这个脚本:
PicoContainer pico = buildContainer( new GroovyContainerBuilder(script, getClass().getClassLoader()), null, "SOME_SCOPE"); //从pico中获得MBeanServer, pico是最外层容器,负责管理MbeanServer和MBeans的关系。 MBeanServer mBeanServer = (MBeanServer)pico.getComponentInstance(MBeanServer.class); //JMX以字符串可以获得对象Wilma的属性和动作 ObjectName objectName = new ObjectName("domain:wilma=default"); MBeanInfo mBeanInfo = mBeanServer.getMBeanInfo(objectName); //pico以字符串为key实现调用对象的 Wilma wilma = (Wilma)pico.getComponentInstance(Wilma.class); wilma.hello();//调用WilmaImpl的hello方法 //jmx以字符串实现对象方法的调用,监察上句执行结果 Boolean called = (Boolean)mBeanServer.invoke( objectName, "helloCalled", null, null); //called结果为true, 也就是WilmaImpl的属性helloCalled结果为true,因为hello方法被调用。 assertTrue(called.booleanValue());

  从以上看出,JMX和Pico互相结合,可以起到互相结合的强大威力。

  从上面代码中,我们可以发现,对于容器中的对象,可以有两种不同的切入角度或是关注角度,也是所谓分散关注:一个是by pico的调用,如wilma.hello();另外一种是JMX提供的另外一种角度,通过JMX提供 的这种角度,我们可以发现或跟踪对象内容的状态,如WilmaImpl的属性helloCalled结果被发现改变。

  这非常类似现代的一些手术,无需开刀(不打开人体这个容器),通过激光或探头手段监察手术效果。

  既然被监察、跟踪,那么就意味着可以被管理了,JMX提供的这种角度被认为是可以将对象纳入被管理范围。

  以上这段代码构架是Pico和JMX的一个综合体,可以说启动了一个新的Java编程架构,称为什么合适呢?微容器 microcontainer!

0
相关文章