Spring 2.0.1 与 BEA WebLogic Server 9.2 的集成
页面: 1, 2, 3, 4

企业 Spring

Spring Framework 的非侵入性 IoC 开发模型不但依赖于 Java EE 应用服务器可用的特性集,而在旨在补充该特性集。事实上,在要求很高的生产环境中,底层应用服务器基础架构提供的服务质量对 Spring 应用程序的持续可靠性、可用性和性能非常重要。WebLogic Server 9.2 提供了企业级特性,能够从各方面增强您的 Spring 应用程序。在本节中,我们将详述这些特性以及如何在 Spring 应用程序中利用它们。

集群管理和部署

一个 WebLogic Server 集群包括多个 WebLogic Server 服务器实例,这些服务器实例同时运行并一起工作,从而提高了可伸缩性和可靠性。对客户端来说,集群就像单个 WebLogic Server 实例一样。构成集群的服务器实例既可运行在同一台计算机上,也可位于不同的计算机上。可以通过在现有的计算机上向集群添加额外的服务器实例,或者向集群添加计算机以托管增加的服务器实例,来提高集群的容量。WebLogic Server 集群为 Spring 应用程序提供了一个企业级部署平台,WebLogic Server 提供的丰富性和易用性是其他支持相似特性的技术所不具备的。有关 WebLogic Server 集群的配置和管理的完整讨论,请参见“Understanding Cluster Configuration”。

通常,Spring 应用程序被打包成 webapp 形式,在这种情况下,您无需为了利用 WebLogic Server 集群而更改自己的应用程序。只需将应用程序部署到集群中的服务器,即可体验增强的可伸缩性和可用性带来的好处。

Spring 会话复制

Spring Web 应用程序通常将信息存储在 HTTP 会话中,如订单 ID 和用户信息。为了支持一个集群内的 servlet 和 JSP 的自动复制和故障切换,WebLogic Server 支持集中用于保持 TTP 会话状态的机制。只需为用户应用程序提供一个适当的 weblogic.xml 部署描述符,它们就能够被 Spring Web 应用程序非侵入性地使用。获取 WebLogic Server 9.0 的提供的有关如何配置各种类型的会话持久性的更多信息。

集群化的 Spring 远程控制

Spring 提供强大的远程控制支持,允许您仍然利用一致的基于 POJO 的编程模型轻松地导出和使用远程服务。通过一个接合到适当 Spring bean 的 RMI 接口,Vanilla Spring 支持代理 POJO 调用。然而,这种支持仅限于 JRMP(Sun 的 RMI 实现),或者通过 JndiRmiProxyFactoryBean 使用特定的远程接口。借助于 Spring 1.2.5 on WebLogic Server 9.0 认证,我们已经扩展了 JndiRmiProxyFactoryBean 和相关的服务导出程序 — 这样它就能支持任何 J2EE RMI 实现的 POJO 代理,包括 RMI-IIOP 和 T3。这方面的支持还包括一个 WebLogic RMI 部署描述符,它支持代理 RMI 接口上的集群化,因此 POJO 调用可以在一个 WebLogic Server 集群内进行负载均衡。客户端上这种支持的配置与此相似 ( applicationContext.xml):

<bean id="proProxy"

  class="org.springframework.remoting.rmi.JndiRmiProxyFactoryBean">

   <property name="jndiName" value="t3://${serverName}:${rmiPort}/order"/>

   </property>

   <property name="jndiEnvironment">

      <props>

         <prop key="java.naming.factory.url.pkgs"> 

               weblogic.jndi.factories

         </prop>

      </props>

   </property>

   <property name="serviceInterface"

       value="org.springframework.samples.jpetstore.domain.logic.OrderService"/>

</bean>

服务导出程序如下(同样来自 applicationContext.xml):

<bean id="order-pro"   class="org.springframework.remoting.rmi.JndiRmiServiceExporter">

   <property name="service" ref="petStore"/>

   <property name="serviceInterface"

     value="org.springframework.samples.jpetstore.domain.logic.OrderService"/>

   <property name="jndiName" value="order"/>

</bean>

集群化的描述符自动包含在其中,仅要求适当的集群配置以及在所有集群成员上部署 Spring 应用程序。获得有关故障切换支持的更多信息。

对 Spring 组件的控制台支持

Spring on WebLogic Server 工具包是一个 WebLogic Server 控制台扩展,它显示了应用程序中定义的 Spring bean、属性和操作。它构建在 WebLogic 控制台扩展门户框架之上,该框架可以转换 WebLogic Administration 控制台的外观、功能和布局,而无需修改服务器或控制台代码。将控制台扩展复制到 yourdomain/console-ext 目录后即进行了部署,随后服务器重新启动。有关部署控制台扩展的更多详细信息,请参考 Spring on WebLogic Server 工具包。

控制台扩展为不是 MBean 的 Spring bean 自动创建 (JMX) 管理接口(对于多数 Spring bean,通常就是这样),通过在 applicationContext.xml 中配置一个 MBeanExporter 并指定经汇编程序公开的 bean 来完成。该特性是 Spring 和 WebLogic Server 无缝地、非侵入性协作的一个极好的例证。 为了使 Spring 应用程序支持 JMX,只需更改应用程序上下文部署描述符。为了使控制台支持 Spring,只需要将两个 jar 部署到现有域即可。

为了在 WebLogic Server 的 Administration 控制台启用 Spring Console 扩展,需要两个 jar 文件;它们作为 Spring WebLogic 程序包的一部分提供。具体来说,这两个所需的 jar 文件称为 spring-ext-server.jarspring-ext-client.jarspring-ext-server.jar 需要复制到 yourdomain/console-ext 目录。相关的 spring-ext-client.jar 文件需要和 Web 应用程序一道部署。(如果是 .WAR 文件,则将 spring-ext-client.jar 放入 Web 应用程序的 WEB-INF/lib 目录。)

有了这两个文件后,剩下的工作就是在 Spring XML 配置文件中定义几个 bean。第一个绝对要定义的 Spring bean 是 com.interface21.wl9.jmx.mediator.Mediator bean。这个 bean(顾名思义)介于用户应用程序、WebLogic Server 的 MBeanServer 和管理控制台三者之间。它的定义如以下示例所示,是个非常简单的 bean:

<!-- WLS console adapter bean -->

<bean id="consoleAdapter" class="com.interface21.wl9.jmx.mediator.Mediator"/>

这个 bean 必须被“插入”(或说相关性注入)第二个 bean 中,即 MBeanExporter,它也是绝对必须进行配置的。 MBeanExporter 类交付的成果就是只需将 Spring 应用程序上下文中已定义的任意数量的不同 bean 导出到 BEA WebLogic MBeanServer(或者任何配置好的 MBeanServer)。注意,MBeanServer 导出的那些 bean 无需为 JMX 进行编码。Spring JMX 基础架构代码负责生成 ModelMBean 来描述通过 JMX 为了进行管理而导出的 bean。下面是一个典型的上下文配置文件的 MBeanExporter bean 定义:

<bean id="exporter" class="org.springframework.jmx.export.MBeanExporter">

  <property name="assembler" ref="assembler"/>

  <property name="server" ref="server"/>

  <property name="beans">

    <map>

      <!-- these are the beans that are to be exported... -->

      <entry key="my_app_name:type=MaintenanceControl" 

             value-ref="maintenanceInterceptor"/>

      <entry key="my_app_name:type=ExceptionMonitor" 

             value-ref="exceptionHandler"/>

      <entry key="my_app_name:type=RequestStatistics" 

             value-ref="requestStatisticsFilter"/>

    </map>

  </property>

  <property name="registrationBehaviorName" 

            value="REGISTRATION_REPLACE_EXISTING"/>

  <property name="autodetect" value="true"/>

  <property name="listeners">

   <list>

    <!-- notice how we 'plug-in' the Mediator bean

           that was defined previously... -->

    <ref bean="consoleAdapter"/>

   </list>

  </property>

</bean>

注意上面的 bean 定义,另一个 bean(“assembler”)被注入到 MBeanExporter 的“assembler”属性中。下面是该 bean 的定义:

<bean id="assembler" class="org.springframework.jmx.export.assembler.InterfaceBasedMBeanInfoAssembler">

 <property name="interfaceMappings">

   <props>

    <prop key="my_app_name:type=MaintenanceControl">fully.qualified.management.interface.name</prop>

    <prop key="my_app_name:type=ExceptionMonitor">fully.qualified.management.interface.name</prop>

    <prop key="my_app_name:type=RequestStatistics">fully.qualified.management.interface.name</prop>

   </props>

 </property>

</bean>

描述 Spring JMX 提供的所有内容不在本文的讨论范围内。此处只需说明一点就够了,那就是上面定义的 InterfaceBasedMBeanInfoAssembler bean 是一个可能的策略,用以控制用户 bean 的哪些方法和属性实际地公开出来供管理之用,就像 JMX 操作和属性那样。 InterfaceBasedMBeanInfoAssembler 使用(任意地)接口决定导出哪些方法和属性。有关更多信息,请参阅本文末尾的“参考资料”一节。

MBeanExporter 的 bean 定义上的第二个著名属性是 server 属性。 这是向 MBeanExporter 注入一个 WebLogic Server 的 MBeanServer 实例的地方。MBeanExporter 将所有已配置的 bean 导出到这一特定的服务器。该 bean 的定义如下所示:

<!-- WebLogic 9 MBeanServer -->

<jndi:jndi-lookup id="server" jndi-name="java:comp/env/jmx/runtime"/>

server bean 的这个定义中,实际上 MBeanServer 实例源自 JNDI(使用为 jndiName 属性指定的值在上下文中查找)。对于 MBeanExporter,MBeanServer 源自 JNDI 的事实没有意义;这个将相关性注入需要相关性的对象透明源引是相关性注入方法的一大附加值(上面所见的易于使用和配置的 JndiObjectFactoryBean 证明 Spring 的注入支持是非常高级的)。

最后,最有趣的是 MBeanExporter 配置的一部分是 beans 属性。 beans 属性是 (JMX) ObjectName 到 bean 的简单映射,这些 bean 将导出到先前注入的 MBeanServer 实例以便管理。选择 ObjectName 的策略(在这种策略下,您的 bean 实际上会导出到 MBeanServer)是完全可配置的。在本例中,所用的默认策略是只需使用 beans 映射的键作为 ObjectName。(有关各种 ObjectName 策略的全面纲要,请参见随 Spring 一起提供的 JavaDoc。)

Web 服务支持

Spring 的远程控制功能的另一个方面是它对 RPC 风格的 Web 服务的支持。WebLogic Server 提供了基于 Ant 的工具,可以根据 Web 服务的描述生成 JAX-RPC 存根。Web 服务客户端使用这些生成的存根获取一个表示服务器端操作的远程接口。Spring 通过提供一个 JaxRpcPortProxyFactoryBean 简化了这个过程。

我们发现,在 WebLogic Server 环境中正确地配置 JaxRpcPortProxyFactoryBean 有些棘手,所以为了节约您的时间,我们给出下面这个代码片段,演示如何为一个包含复杂类型的文档字面包装的 Web 服务配置代理生成。

多数属性是自解释的。有几个属性比较有名:

  • serviceInterface 是 Spring setter 注入的副产品。这个类将表示 Web 服务操作。

  • customProperties 属性支持定制的 WebLogic Server Web 服务存根属性。

  • jaxRpcService 值设置为 WebLogic Server 的生成的 JAX-RPC 实现服务。JAX-RPC 服务负责验证 Web 服务和加载复杂类型映射。为了实现后者,WebLogic Server 的 JAX-RPC 实现服务必须配置为一个 Spring bean。这可以确保 JAX-RPC 服务构造函数的运行,而且类型映射文件也在此加载。

JaxRpcPortProxyFactoryBean 上将 lookupServiceOnStartup 设置为 false,即可在启动时关闭 JAX-RPC 服务查找。当首次访问时,将会进行查找。这对于与可靠的 WebLogic Server 请求/响应 Web 服务通信是必需的,而此处的客户端也必须是一个 Web 服务。在这些情况下,始发客户端通常是与 Web 服务客户端一起部署的。 因为应用程序部署完成前不会激活 Web 服务,所以客户端 Web 服务对于 Spring 上下文加载是不可用的。如下代码摘自一个 applicationContext-ws.xml 上下文配置文件:

<!-- reliable asynchronous Web service for sending new medical records to medrec -->

<bean id="reliableClientWebServicesPortType"

  class="org.springframework.remoting.jaxrpc.JaxRpcPortProxyFactoryBean"

  lazy-init="true">

   <property name="wsdlDocumentUrl"

     value="http://${WS_HOST}:${WS_PORT}/ws_phys/PhysicianWebServices?WSDL"/>

   <property name="portName" value="PhysicianWebServicesPort"/>

   <property name="jaxRpcService">

      <ref bean="generatedReliableService"/>

   </property>

   <property name="serviceInterface"

     value="com.bea.physician.webservices.client.PhysicianWebServicesPortType"/>

   <property name="username" value="medrec_webservice_user"/>

   <property name="password" value="weblogic"/>

   <property name="customProperties">

      <props>

         <prop key="weblogic.wsee.complex">true</prop>

      </props>

   </property>

</bean>



<!-- allows the jaxRpcService class to execute its constructor which loads in type mappings -->

<bean id="generatedReliableService"

  class="com.bea.physician.webservices.client.PhysicianWebServices_Impl">

</bean>

有关更多信息,请参见 WebLogic Server 的 Overview Web Services Invocation 和 Remoting and Web Services Using Spring

页面: 1, 2, 3, 4

下一页 »