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结合比较调用实例如下:
script是一段Groovy脚本,这段脚本是向Pico注册一个MBeanServer,并且向MBeanServer中注册一个MBean:接口是org.nanocontainer.testmodel.Wilma;实现是org.nanocontainer.testmodel.WilmaImpl,代码如下: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" +
"}");
NanoContainer可以运行装载这个脚本:public interface Wilma {
void hello();
}
![]()
![]()
public class WilmaImpl implements Wilma {
![]()
private boolean helloCalled;
![]()
public boolean helloCalled() {
return helloCalled;
}
![]()
public void hello() {
helloCalled = true;
}
}
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!
