Spring框架将体系结构依赖性降至最低,并且将应用程序中的组成部分进行了具体化,但是应用程序仍然是需要管理的。幸运的是,Spring1.2包括高级的JMX集成支持,并且JMX为应用程序提供了一种实用的管理基础架构。在本文中,Claude Duguay从Spring JMX更进一步,向您展示了如何为方法和属性透明地增加通知事件。最后得到的代码使您可以监视状态变化,同时不会搞乱Java对象。
虽然Spring框架的JMX管理基础架构的默认配置已经很不错了,但是仍然有定制的余地,特别是涉及Model MBean提供的更高层功能时。在本文中,我使用了一种相对简单的操作——为基于Spring的应用程序的方法和属性增加通知事件——以帮助您熟悉对Spring JMX的定制。从头到尾完成我的例子后,您将可以根据自己应用程序的需要调整Spring JMX管理基础架构。
我首先对JMX API、Spring框架和Spring JMX进行简单回顾,然后转入开发扩展。第一个扩展让我可以用一个外部XML格式配置MBean元数据,这个格式(像Hibernate映射文件)可以与Java对象一起存储在类路径中。我的第二个扩展为Model MBean类增加一个简单的命名规范,以透明地配置定制的通知消息。在属性改变时或者调用了特定的方法之前或者之后触发新的通知消息。
文章的最后是一个基于mockup服务对象的实际例子,需要管理它的启动和停止方法和读写属性。我用一个专门为此设计的小型客户机/服务器应用程序测试了这个实现。应用服务器是一个标准Java 5.0 MBeanServer,并补充了源自MX4J开放源码项目的HTTP适配器。
JMX概述
Java Management Extensions(JMX)是管理和监视网络上的服务的、基于Java的标准。JMX API的核心是受管bean,即MBean。MBean为受管资源(如应用程序、服务和设备)提供了设施层。简而言之,MBean提供了一种灵活的、基于适配器的体系结构,用于开放基于Java的(或者Java包装的)资源的属性和操作。开放后,就可以用浏览器和HTTP连接或者通过像SMTP或者SOAP这样的协议监视和管理这些资源。
编写和部署的MBean是通过MBeanServer接口开放的,以使不同的应用程序视图具有交互性。MBeanServer实例还可以结合到任意的联合关系中,构成更复杂的分布式环境。
JMX标准提供了四种不同的MBean:
◆Standard MBean
直接实现用于管理对象的方法,既可以通过实现一个由程序员定义的、类名以“MBean”结束的接口,也可以使用一个以一个类作为构造函数参数的Standard MBean实例,加上一个可选的接口类规范。这个接口可以开放用于管理的部分对象方法。
◆Dynamic MBean
用属性访问器动态地访问属性,并用一个一般化的invoke()方法调用方法。可用的方法是在MBeanInfo接口中指定的。这种方式更灵活,但是不具有像Standard MBean那样的类型安全性。它极大地降低了耦合性,可管理的POJO(纯粹的老式Java对象)不需要实现特定的接口。
◆Model MBean
提供了一个改进的抽象层,并扩展了Dynamic MBean模型以进一步减少对给定实现的依赖性。这对于可能使用多个版本的JVM或者需要用松散耦合管理第三方类的情况会有帮助。Dynamic MBean 与Model MBean之间的主要区别是,在Model MBean中有额外的元数据。
◆Open MBean
受限的Model MBean,它限制类型为固定的一组类型,以得到最大的可移植性。通过限制数据类型,可以使用更多的适配器,并且像SMTP这样的技术可以更容易适应Java应用程序的管理。这种变体还指定了数组和表等标准结构以改进复合对象的管理。
如果要同时控制客户机和服务器,那么Standard MBean是最容易实现的一种变体。它们的优点是有类型,但是如果在更一般化的管理控制台环境中使用时会缺少一些灵活性。如果计划使用Dynamic MBean,那么您也可以更一步使用Model MBean,在大多数情况下它会改善抽象层而几乎不会增加复杂性。Open MBean是可移植性最高的一种变体,如果需要开放复合对象,那么它是惟一的方法。不幸的是,在Open MBean中开放复合结构所需要的代码数量过多,只有在需要高级的商业管理解决方案时才合算。
JMX还支持使用带过滤器和广播器的事件模型的通知。为此目的,Standard MBean需要声明一个MBeanInfo元数据描述。Standard MBean实现通常在内部构造这些内容,开发人员不能直接看到它们。在本文后面,您会看到如何用Model MBean元数据的XML描述符格式和Spring的JMX支持进行实际上透明的配置。
Spring提供帮助
像J2EE一样,Spring框架在一个体系结构中提供了许多强大的Java开发功能。与J2EE不同的是,Spring开放型的技术来源提供了范围广泛的选择,不再有依赖性的负担。例如,Spring的对象关系映射工具可以复制Enterprise JavaBean的行为,同时不会导致不灵活。虽然EJB规范限制了这种方式,但是Spring提供了大量技术接口,使您可以选择最适合应用程序要求的接口,或者在需要时创建自己的接口。与此类似,利用Spring的动态代理类为Java对象增加事务性或者安全限制,使它们保持整洁并针对应用程序空间而不是基础架构要求。
Spring的支持AOP的、以复合为中心的(IOC)bean可以很大程度上使基础架构和业务对象彼此分离。因此,横切关注点(如日志、事务和安全)不会再干扰应用程序代码。
IOC(控制反转)是减少耦合度的主要策略。Spring的IOC实现使用依赖性注入有效地将控制从应用程序代码“反转”到Spring容器。Spring不是在创建时将类耦合到应用程序的对象图,它使您可以用XML或者属性文件(尽管XML被认为是最好的方法)配置类及它们的依赖性。然后用标准访问器将引用“注入”到类所依赖的对象中。可以将它看成具体化复合(externalizing composition),在典型应用程序中,它的比重远远大于继承。
AOP是在应用程序开发中管理横切关注点的关键。就像在传统面向对象编程中实现的那样,这些关注点是作为单独的实例处理的,有可能在应用程序类中产生互不相关的代码(就是混乱)。Spring使用AOP规范和一个XML配置文件具体化横切关注点,因而保持了Java代码的纯洁性。
共6页: 1 [2] [3] [4] [5] [6] 下一页 |