|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
在性能方面,在windows平台下,.net可能是占强项,要是把.net放在sun开发的操作系统上去运行呢?根本就运行不了,.net对其它操作系统的支持也很弱,性能也可能比不上java。http://www.alixixi.com/UploadPic/2007-7/200777112332298.swf Spring框架将系统布局依附性降至最低,而且将使用程序中得构成部分举行了详细化,可是使用程序仍旧是必要办理的。侥幸的是,Spring1.2包含初级的JMX集成撑持,而且JMX为使用程序供应了一种有用的办理基本架构。在本文中,ClaudeDuguay从SpringJMX更进一步,向您展现了怎样为办法和属性通明地增添关照事务。最初失掉的代码使您能够监督形态变更,同时不会搅散Java?对象。
固然Spring框架的JMX办理基本架构的默许设置已很不错了,可是仍旧有定制的余地,出格是触及ModelMBean供应的更高层功效时。在本文中,我利用了一种绝对复杂的操纵――为基于Spring的使用程序的办法和属性增添关照事务――以匡助您熟习对SpringJMX的定制。从头至尾完成我的例子后,您将能够依据本人使用程序的必要调剂SpringJMX办理基本架构。
我起首对JMXAPI、Spring框架和SpringJMX举行复杂回忆,然后转进开辟扩大。第一个扩大让我能够用一个内部XML格局设置MBean元数据,这个格局(像Hibernate映照文件)能够与Java对象一同存储在类路径中。我的第二个扩大为ModelMBean类增添一个复杂的定名标准,以通明地设置定制的关照动静。在属性改动时大概挪用了特定的办法之前大概以后触发新的关照动静。
文章的最初是一个基于mockup服务对象的实践例子,必要办理它的启动和中断办法和读写属性。我用一个专门为此计划的小型客户机/服务器使用程序测试了这个完成。使用服务器是一个尺度Java5.0MBeanServer,并增补了源自MX4J开放源码项目标HTTP适配器。
JMX概述
JavaManagementExtensions(JMX)是办理和监督收集上的服务的、基于Java的尺度。JMXAPI的中心是受管bean,即MBean。MBean为受管资本(如使用程序、服务和设备)供应了举措措施层。简而言之,MBean供应了一种天真的、基于适配器的系统布局,用于开放基于Java的(大概Java包装的)资本的属性和操纵。开放后,就能够用扫瞄器和HTTP毗连大概经由过程像SMTP大概SOAP如许的协定监督和办理这些资本。
编写和部署的MBean是经由过程MBeanServer接口开放的,以使分歧的使用程序视图具有交互性。MBeanServer实例还能够分离就任意的团结干系中,组成更庞大的散布式情况。
JMX尺度供应了四种分歧的MBean:
- StandardMBean间接完成用于办理对象的办法,既能够经由过程完成一个由程序员界说的、类名以“MBean”停止的接口,也能够利用一个以一个类作为机关函数参数的StandardMBean实例,加上一个可选的接口类标准。这个接口能够开放用于办理的部分对象办法。
- DynamicMBean用属性会见器静态地会见属性,并用一个一样平常化的invoke()办法挪用办法。可用的办法是在MBeanInfo接口中指定的。这类体例更天真,可是不具有像StandardMBean那样的范例平安性。它极年夜地下降了耦合性,可办理的POJO(地道的老式Java对象)不必要完成特定的接口。
- ModelMBean供应了一个改善的笼统层,并扩大了DynamicMBean模子以进一步削减对给定完成的依附性。这关于大概利用多个版本的JVM大概必要用松懈耦合办理第三方类的情形会有匡助。DynamicMBean与ModelMBean之间的次要区分是,在ModelMBean中有分外的元数据。
- OpenMBean是受限的ModelMBean,它限定范例为流动的一组范例,以失掉最年夜的可移植性。经由过程限定数据范例,可使用更多的适配器,而且像SMTP如许的手艺能够更简单顺应Java使用程序的办理。这类变体还指定了数组和表等尺度布局以改善复合对象的办理。
假如要同时把持客户机和服务器,那末StandardMBean是最简单完成的一种变体。它们的长处是有范例,可是假如在更一样平常化的办理把持台情况中利用时会短少一些天真性。假如企图利用DynamicMBean,那末您也能够更一步利用ModelMBean,在年夜多半情形下它会改良笼统层而几近不会增添庞大性。OpenMBean是是可移植性最高的一种变体,假如必要开放复合对象,那末它是唯一的办法。不幸的是,在OpenMBean中开放复合布局所必要的代码数目过量,只要在必要初级的贸易办理办理计划时才合算。
JMX还撑持利用带过滤器和播送器的事务模子的关照。为此目标,StandardMBean必要声明一个MBeanInfo元数据形貌。StandardMBean完成一般在外部机关这些内容,开辟职员不克不及间接看到它们。在本文前面,您会看到怎样用ModelMBean元数据的XML形貌符格局和Spring的JMX撑持举行实践上通明的设置。
Spring供应匡助
像J2EE一样,Spring框架在一个别系布局中供应了很多壮大的Java开辟功效。与J2EE分歧的是,Spring开放型的手艺来历供应了局限普遍的选择,不再有依附性的包袱。比方,Spring的对象干系映照工具能够复制EnterpriseJavaBean的举动,同时不会招致不天真。固然EJB标准限定了这类体例,可是Spring供应了大批手艺接口,使您能够选择最合适使用程序请求的接口,大概在必要时创立本人的接口。与此相似,使用Spring的静态代办署理类为Java对象增添事件性大概平安限定,使它们坚持整齐并针对使用程序空间而不是基本架构请求。
Spring的撑持AOP的、以复合为中央的(IOC)bean能够很年夜水平上使基本架构和营业对象相互分别。因而,横切存眷点(如日记、事件和平安)不会再搅扰使用程序代码。
IOC(把持反转)是削减耦合度的次要战略。Spring的IOC完成利用依附性注进无效地将把持从使用程序代码“反转”到Spring容器。Spring不是在创立时将类耦合到使用程序的对象图,它使您能够用XML大概属性文件(只管XML被以为是最好的办法)设置类及它们的依附性。然后用尺度会见器将援用“注进”到类所依附的对象中。能够将它当作详细化复合(externalizingcomposition),在典范使用程序中,它的比重远宏大于承继。
AOP是在使用程序开辟中办理横切存眷点的关头。就像在传统面向对象编程中完成的那样,这些存眷点是作为独自的实例处置的,有大概在使用程序类中发生互不相干的代码(就是凌乱)。Spring利用AOP标准和一个XML设置文件详细化横切存眷点,因此坚持了Java代码的纯正性。
先容SpringJMX
Spring1.2中的JMX撑持利用简单设置的bean代办署理供应了主动MBeanServer注册,并撑持尺度JSR-160远程毗连器。在最复杂的情形下,能够用SpringJMX以MBeanExporter类注册对象。Spring主动辨认StandardMBean大概用ModelMBean代办署理包装对象,在默许情形下利用内省。能够以显式援用利用BeanExporter以声明bean,大概能够用默许战略或更庞大的战略主动检测bean。
Spring1.2供应的大批拆卸器使得通明地机关MBean成为大概,包含利用内省、StandardMBean接口、元数据(利用类级别正文)和显式声明的办法名。Spring的基于导出器和拆卸器的模子简单扩大,并在创立注册的MBean时供应所必要的把持才能。
JMX利用ObjectName言语注册和会见办理对象。假如选择利用主动注册,那末Spring供应了分歧的定名战略。利用“键”定名战略时,可使用一个属性把MBean名与NameObject实例联系关系起来。假如完成ManagedResource接口,那末可使用元数据定名标准。因为Spring高度天真的系统布局和大批扩大点,还能够完成自已的战略。
在默许情形下,Spring会发明运转的MBeanServer实例,假如没有实例在运转大概没有显式声明的话,它会创立一个默许实例。用Spring设置间接实例化本人的MBeanServer与利用各类毗连器一样简单。Spring经由过程客户机和服务器毗连供应把持,并供应客户机代办署理以帮忙客户端编程。
一切这些功效都是Spring1.2默许供应的。固然SpringJMX供应了大批选项,可是默许的导出器关于很多项目来讲已充足了,使您能够很快地投进运转。不外,利用JMX时,在利用隐式MBean机关时会注重到一些特征。了局,大概会渐渐地从StandardMBean转移到ModelMBean,它同意对使用程序的属性、操纵和关照元数据施加更多的把持。要保存松懈耦合的优点(也就是Spring天真的系统布局内涵的长处),必要在Java对象以外完成这个把持。
Spring的IOC使得从内部毗连(wire)对象依附性简单了,在Spring的系统布局中很简单使用这类长处。IOC坚持对象依附性的可注进性,这使得增添、交换大概增补对象的举动(包含Spring的JMX撑持)变得十拿九稳。在本文的其他部分,我将重点放到扩大SpringJMX以失掉更细化的使用程序办理,而不会搅散使用程序代码大概损坏Spring固有的天真性。
扩大SpringJMX
Spring框架供应了很多处置JMX的有效工具,包含用于扩大JMX功效的扩大点。我将使用它们取得对MBeanInfo声明的更多把持,同时不必对Java对象施加正文。为此,我将要以两种体例扩大SpringJMX:第一种办法能够用一个内部XML格局(相似于JBoss微内核)设置MBean元数据,第二种办法能够与其相干联的Java对象一同存储在在类路径中(很像Hibernate映照文件)。
我将扩大RequiredModelMBean类,让它利用一个复杂的定名标准,以<ClassName>.mbean.xml格局寻觅相干的MBean部署形貌符。界说这类基于XML的MBean形貌符改善了对使用程序元数据的把持,而不会得到基于POJO的计划和Spring复合的天真性。为了完成这一点,我将完成本人的拆卸器并扩大基础的SpringJMX导出器。扩大的导出器能够创立扩大的ModelMBean,它撑持截获属性的改动和before和after办法实行的关照。我能够用Spring的AOP机制完成这统统,可是ModelMBean已是底层受管资本的代办署理,因而我将用更间接的体例扩大RequiredModelMbean类。
办理基本
不论利用甚么手艺,在办理资本时有三个要存眷的次要范畴:
- 属性(attribute)(偶然称为属性(property)、字段大概变量)。只读属性关于开放器度大概形态很有效。读/写属性使办理员能够改动设置。
- 举措(action)(可实行挪用,关于Java代码来讲就是办法)。举措用于触发像启动和封闭如许的事务,大概其他特定于使用程序的操纵。
- 事务(event)(向监督体系收回的关照,反应形态改动大概一些操纵的实行)。关照确认操纵大概形态改动的确产生了。关照还能够用于触发事务,如关于凌驾设置阀值(好比内存大概磁盘空间等资本不敷)的形态改动做出反响。这类关照能够用于在体系必要存眷时向使用程序办理员发送电子邮件大概传呼。
在扩大SpringJMX时,我将用一个复杂的案例分离展现这三个必要存眷的范畴:一个带有入手下手和中断办法而且有一个读写属性要办理的示例服务。我还要用一个小型的客户机/服务器使用程序测试这个完成,并开放一个利用MX4J适配器的HTTP办理接口。一切例子将有需要的限定,可是足以使您了解响应的观点。您会看到在基于Spring的使用程序办法和属性中到场JMX关照事务有何等简单,了局是能够监督形态改动,同时不会在Java对象中到场不用要的代码。
MBeanInfo模子
假如下载与本文有关的代码,您会发明一个名为com.claudeduguay.mbeans.model的包,它包括一组用于建模MBeanInfoXML文件的类。这个包包括大批类,因而我不会具体会商一切类,可是其基础内容仍是有需要申明的。
模子的根是MBeanDescriptor类,它供应了一个createMBeanInfo()办法,卖力用使用程序元数据创立一个兼容JMX的ModelMBeanInfo实例。MBeanDescriptorUtil类供应了两个静态的read()办法,它装载并保留这个XML文档模子。这个模子中利用的Document和Element实例基于JDOM框架。
我利用的基础MBeanInfo相干类和形貌符模子是亲切相干的。基类中的一切基础属性都是在XML中建模的,并能够用复杂的格局界说。比方,<mbean>标志是我的文档的根。它与ModelMBeanInfo间接相干,它等候一个type和description属性。范例是受管bean的完整限制类名。不外,在利用我的Sping办理计划时,这个类完整能够在高低文中派生。<mbean>标志等候零个大概多个attribute、operation、constructor和notification子范例。它们每个都供应了基MBeanInfo类XML属性。
.MBeanXML格局
MBean模子完成使用了com.claudeduguay.util.jdom包中几个与JDOM相干的工具类。它们次要是剖析和构建Document和Element对象的接口,一个工具类使读和写Document流更简单。要检察的年夜多半代码在com.claudeduguay.mbeans.spring包中。
已做了充足的准备事情,让我们入手下手扩大SpringJMX!
改善ModelMBean中的关照
我要做的第一件事是扩大SpringJMXModelMBean完成,如许就能够发送关照而不必在办理的资本中间接完成这个举动。为此,还必要扩大Spring导出器以创立改善的ModelMBean实例。最初,还必要用一个新的拆卸器从映照文件中提取MBeanInfo元数据。
ModelMBeanExtension类
扩大RequiredModelMBean类的一个目标是在办理代办署理中通明地启用关照。这个使用程序必要三种关照:设置属性值、办法挪用之前和办法挪用以后。由于动静是我本人设置的,在每种情形下,它都能够依照我必要的那样供应信息。要完成这一点,我对范例关照利用了一个定名标准,个中关于款式<matchingType>.<methodOrAttributeName>反省点分开的范例名。婚配的范例必需为set、before大概after之一。假如范例是set,那末就以为是一个属性名,不然,就以为是一个办法名。
扩大的ModelMBean代码利用分外的类匡助举行耦合。第一个是NotificationInfoMap,它是一个用关照元数据构建的、复杂的Map,并与前缀(set|before|after)点名(method|attribute)款式相干联,如许就能够更无效地失掉婚配的关照元数据。第二个是工具办法的一个静态汇合。清单1显现了为关照而扩大的RequiredModelMBean:
清单1.ModelMBeanExtension- packagecom.claudeduguay.mbeans.spring;importjava.lang.reflect.*;importjavax.management.*;importjavax.management.modelmbean.*;publicclassModelMBeanExtensionextendsRequiredModelMBean{protectedNotificationInfoMapnotificationInfoMap;protectedModelMBeanInfomodelMBeanInfo;protectedObjectmanagedBean;publicModelMBeanExtension()throwsMBeanException{}publicModelMBeanExtension(ModelMBeanInfomodelMBeanInfo)throwsMBeanException{super(modelMBeanInfo);this.modelMBeanInfo=modelMBeanInfo;notificationInfoMap=newNotificationInfoMap(modelMBeanInfo);}publicvoidsetModelMBeanInfo(ModelMBeanInfomodelMBeanInfo)throwsMBeanException{this.modelMBeanInfo=modelMBeanInfo;notificationInfoMap=newNotificationInfoMap(modelMBeanInfo);super.setModelMBeanInfo(modelMBeanInfo);}publicMBeanNotificationInfo[]getNotificationInfo(){returnmodelMBeanInfo.getNotifications();}publicvoidsetManagedResource(ObjectmanagedBean,Stringtype)throwsMBeanException,RuntimeOperationsException,InstanceNotFoundException,InvalidTargetObjectTypeException{super.setManagedResource(managedBean,type);this.managedBean=managedBean;}protectedvoidmaybeSendMethodNotification(Stringtype,Stringname)throwsMBeanException{MBeanNotificationInfoinfo=notificationInfoMap.findNotificationInfo(type,name);if(info!=null){longtimeStamp=System.currentTimeMillis();StringnotificationType=ModelMBeanUtil.matchType(info,"."+type+"."+name);sendNotification(newNotification(notificationType,this,timeStamp,info.getDescription()));}}protectedvoidmaybeSendAttributeNotification(Attributeattribute)throwsMBeanException,AttributeNotFoundException,InvalidAttributeValueException,ReflectionException{Stringname=attribute.getName();MBeanNotificationInfoinfo=notificationInfoMap.findNotificationInfo("set",attribute.getName());if(info!=null){ObjectoldValue=getAttribute(name);ObjectnewValue=attribute.getValue();longtimeStamp=System.currentTimeMillis();StringnotificationType=ModelMBeanUtil.matchType(info,".set."+name);sendNotification(newAttributeChangeNotification(this,timeStamp,timeStamp,info.getDescription(),info.getName(),notificationType,oldValue,newValue));}}publicObjectinvoke(Stringname,Object[]args,String[]signature)throwsMBeanException,ReflectionException{maybeSendMethodNotification("before",name);ObjectreturnValue=super.invoke(name,args,signature);maybeSendMethodNotification("after",name);returnreturnValue;}publicObjectgetAttribute(Stringname)throwsMBeanException,AttributeNotFoundException,ReflectionException{try{Methodmethod=ModelMBeanUtil.findGetMethod(modelMBeanInfo,managedBean,name);returnmethod.invoke(managedBean,newObject[]{});}catch(IllegalAccessExceptione){thrownewMBeanException(e);}catch(InvocationTargetExceptione){thrownewMBeanException(e);}}publicvoidsetAttribute(Attributeattribute)throwsMBeanException,AttributeNotFoundException,InvalidAttributeValueException,ReflectionException{try{Methodmethod=ModelMBeanUtil.findSetMethod(modelMBeanInfo,managedBean,attribute.getName());method.invoke(managedBean,attribute.getValue());maybeSendAttributeNotification(attribute);}catch(InvocationTargetExceptione){thrownewMBeanException(e);}catch(IllegalAccessExceptione){thrownewMBeanException(e);}}}
复制代码 不必要代办署理代办署理!
由于ModelMBean已是一种代办署理,以是不必要利用Spring的代办署理机制和AOP截获器来截获感乐趣的办法。ModelMBean接口必要setAttribute和invoke办法的完成以办理对底层受管资本的挪用。能够承继RequiredModelMBean类,包管它呈现在一切JMX完成中,并增添我所必要的功效。
我的ModelMBeanExtension完成了一样的机关函数,可是在一个实例变量中存储了ModelMBeanInfo的一个正本。由于这个值能够经由过程机关函数大概挪用setModelMBeanInfo办法设置,以是我掩盖了这个办法以存储这个值,挪用超类以完成默许的举动。在默许情形下,RequiredModelMBean类增添两个一样平常性关照形貌符,因而我掩盖了getNotificationInfo()办法,只前往我形貌的关照。仍旧会发送一样平常性关照,可是请求特定关照的客户不会看到它们。
为了发送关照,我掩盖了setAttribute()和invoke()办法并反省挪用是不是婚配我的关照信息形貌符。每次都遍历列表应当不会带来很年夜的开支,由于年夜多半类只会发送无限的一组关照,可是我必要测试每个关照大概的很多关照范例字符串,而反复这一历程看来是个华侈。为了包管不会碰到功能成绩,我实例化了一个关照信息映照,这是一个称号/信息映照,能够用来举行疾速查询。关头是一个具有范例前缀(set、before大概after)和所触及的属性和办法的复杂字符串。可使用findNotificationInfo()办法在setAttribute()挪用大概办法挪用时查找关照信息实例。
完成了基本架构后,就能够截获对setAttribute()和invoke()办法的挪用了。属性改动必要发送一个AttributeChangeNotification实例,它请求有旧的属性值和新的值,和从关照信息形貌符中能够失掉的细节。在发送关照时,假如动静按次是凌乱的,则要发送序列号,让客户机使用程序能够抵消息排序。为了简化,我利用了以后工夫戳而不是办理一个计数器。创立关照对象时,sendNotification()办法包管它会公布。关于invoke()办法利用一样的思绪,只管在这里我利用了更复杂的Notification对象。能够挪用超类中的invoke()办法同时反省这二者(before和after),并依据查找了局发送before和after关照。
但是我同意你的观点,对于大型项目来说,应该是采用框架的一部分,根据功能的不同而改进,欢迎你能再提出些宝贵意见,我会多多学习的。说到jbuilder,我可能是个人感觉,用的时候确实没有vs爽,我最喜欢的IDE是netbeans,谢谢。 |
|