web配置spring框架_使用Spring的Web服务模拟器框架解决方案

web配置spring框架

复杂的开发项目通常要求开发流尽可能彼此独立地进行。 假设接口(这些不同子系统之间的合同)已在软件开发生命周期(SDLC)中尽早完成,那么基于仿真器的良好开发策略可以在开发过程中实现重大优化。

在将新应用程序和系统部署到现有环境中(例如,在电信领域中,其中大量独立软件供应商(ISV)混杂在一起,并且非功能性需求至关重要)的情况下,这尤其重要。特别是管理系统延迟和吞吐量方面的考虑。 在这些类型的复杂环境中,有许多因素使新应用程序实际交付到现有环境中的过程变得复杂,下面列出了其中一些:

  1. 在没有新应用程序依赖的所有系统和服务实现的情况下,需要开发和交付功能
  2. 需要最大程度地并行化与不同流相关的开发活动,同时最小化跨流依赖性
  3. 以新应用程序能够证明其端到端满足吞吐量和延迟要求的方式交付功能的需求
  4. 需要使开发团队与他们在SDLC的代码和单元测试阶段所依赖的子系统的更改隔离开来
  5. 需要以可重复,可靠和稳定的过程轻松配置各种测试数据方案

在所有这些领域中,强大的模拟器框架可提供巨大的价值。 本文介绍了这样一种模拟器框架,并说明了如何使用WebSphere®Application Server构建一个模拟器框架。 尽管这里的重点是使用面向服务的体系结构(SOA)的应用程序,但也可以将其扩展到其他类型的环境和体系结构。

模拟器是最佳实践

模拟器概述

韦伯斯特词典将模拟器定义为“一种使操作员能够在测试条件下再现或表示实际性能中可能出现的现象的设备”。 模拟器可以用作SDLC的一部分,以通过为调用应用程序实际显示的后端服务调用提供端点,从而启用更敏捷的开发环境,但实际上仅是模拟真实系统。 模拟器以与实时后端服务相同的格式进行响应,并使用相同的请求/响应协定,但仅从可配置数据中返回预设数据。 这样,即使您无权访问系统本身,也可以对支持系统的功能和非功能特性进行建模。

一种类似且更常见的编程实践是利用存根接口绕过本地客户端接口调用,而代之以执行不同的本地代码路径以返回预设数据。 在许多情况下,存根会加快初始开发的速度,但是存根却无法提供通过执行完整的代码路径并调用工作接口所能获得的相同级别的功能。 使用存根方法,应用程序必须知道它处于“存根模式”,因此它可以使用不同的代码路径。 通过使用模拟器,应用程序仅更改端点,并且不知道响应来自模拟的后端系统。

图1和图2显示了两种方法之间的差异。

图1.使用本地存根代码绕过Web服务调用的应用程序
该图显示了使用STUB方法的应用程序流,其中在到Web服务客户端的途中拦截了调用。
图2.使用模拟器作为Web服务端点而不是实时后端系统的应用程序
该图显示了使用模拟器的应用程序的流程,其中没有截获任何内容,并且客户端从模拟器接收了请求和响应。

在大多数情况下,应用程序与各种Web服务进行通信,您最初的想法可能是在没有实时接口时使用存根方法。 这可能会导致在用户界面上快速产生所需的视觉流,但是在客户端进行存根测试不会测试数据的互连性或封送处理。 因此,您可以模拟的距离越远,受益越多,因为它可以锻炼更多的系统。 图2说明了创建模拟器的最佳点。

为了进一步说明这个概念,请看一个Web 2.0示例,其中包括来自客户端的异步JavaScript和XML(Ajax)请求以及来自服务器JavaScript对象表示法(JSON)响应,这些响应取决于要构建的后端系统响应。

图3.示例Web 2.0交互
该图显示了一个三层应用程序,其中客户端与应用程序服务器交互,而后者又与后端服务器交互。

建立的第一个协定是客户端和应用程序之间的JSON对象。 使用Web服务定义语言(WSDL)在应用程序和后端服务器之间建立第二个合同。 在初始开发期间,JSON合同和Web Service合同代表了共同点,您可以在其中创建存根接口,让您可以通过维护此合同独立于另一端的开发人员进行开发。

从理论上讲,当每个小组根据已建立的合同完成开发时,可以几乎没有问题地集成应用程序。 但是,实际上,集成到多个外部系统时通常不是这种情况。 在集成期间,接口通常会返回意外的结果,或者从一个服务到需要某种编排级别的另一服务进行一系列的依赖调用。 单个损坏或不可用的接口可能会阻止下游的多个开发团队。

使用模拟器进行开发的好处

当开发具有多个需要大量依赖关系的开发组的复杂系统时,接口延迟的风险概率达到可以肯定的水平。 服务模拟是一个关键的缓解工具,可以在复杂系统的开发过程中主动将其包括在内,以显着降低风险和延误。

确定仿真级别时,需要考虑一些关键因素。 在许多情况下,最简单的模拟级别是无论输入如何都返回相同的响应。 这对于完成初始单元测试很有用,但很少足以确保质量代码。 通常,通过基于请求数据返回更复杂的响应来进一步扩展模拟器。 在某些情况下,请求数据用于在XML文件中查找响应。 在其他情况下,请求数据将在计算中被重用或操纵以用于响应中。

为了实现这些更复杂的响应,需要建立一种简单,灵活且轻便的模拟器模式,以便开发人员可以轻松采用它,同时提供全面的模拟水平。

图4.模拟器可用的数据将影响其对开发团队的有用性及其整体成功
该图显示了一个三层的应用程序体系结构,其中Ajax作为客户端与应用程序服务器交互,该客户端通过Web服务与另一应用程序服务器交互。最终的应用服务器具有Web服务模拟器。

使用模拟器进行功能测试的好处

SLDC中模拟的好处超出了开发阶段。 诸如Scrum,极限编程和功能驱动开发之类的较新方法可促进迭代开发,但可能与常规瀑布驱动方法相冲突,后者需要满足顺序门才能进入下一阶段。 如果快速开发的组件依赖于具有较长开发周期的关键接口,则很难实现迭代测试。 在这些情况下,可以使用模拟器在实时界面可用之前测试组件,并且通常可以尽早发现大多数问题。 尝试在后端系统中提供测试数据以支持所有可能的错误情况时,通常也会遇到挑战。 模拟器提供了一种有效的替代方案,用于测试罕见的场景或使用实时后端系统难以生成的负面测试案例。

模拟程序还可以提供出色的风险缓解策略。 随着系统接口数量的增加和复杂性的增加,中断和计划延误的风险也会增加。 总是会出现这样的情况:由于需要补丁来解决问题,接口不可用,或者开发人员必须安排停机时间才能在活动测试窗口中使用接口。 在这些情况下,开发人员和测试团队可能会浪费宝贵的时间等待完全集成且功能齐全的系统。 通过在测试环境中包括模拟器,应用程序可以通过为从不可用服务到正在运行的模拟服务的特定接口重新配置端点来避免中断。 测试系统可以继续将实时接口用于所有工作系统,并且仅指向模拟器以获取不可用的服务。

通常会与模拟器一起开发服务仪表板,以使开发人员和测试人员能够测试模拟服务的请求和响应。 这样可以快速验证响应数据的配置。 由于模拟器模拟实时后端服务,因此服务仪表板还可用于测试实时后端服务(如果可用)并进行故障排除。 在某些情况下,服务仪表板将显示模拟器中不可用的独特响应方案。 服务仪表板可以包括记录原始请求和响应的功能,该功能使模拟器得以增强,可以将此场景包含在其模拟集中。

图5展示了由实时后端服务和模拟器组合支持的系统的逻辑视图。 它显示了通过企业服务总线(ESB)连接到各种服务的外部应用程序。 黄色服务(服务1,2和7)指示当前尚不可用且由模拟器提供的服务。 红色服务(服务3和4)代表可能正在开发中或无法使用的服务。 ESB将对这些红色服务的服务请求重新路由到模拟服务。

图5.利用模拟服务和真实后端服务的组合的系统的逻辑视图
该图显示了一个通过企业服务总线交互的应用程序,根据资源的状态将一些服务路由到实时系统,将一些服务路由到模拟器。

用于非功能测试的模拟器的好处

性能测试是SDLC的重要方面。 在许多情况下,为测试而创建的环境无法模仿生产环境的性能特征。 当公司拥有昂贵的系统,而这些系统过于昂贵而无法在测试环境中完全复制时,通常会出现这种情况。 在这些情况下,模拟器可以成为性能测试的重要组成部分,因为它们可以模拟预期的生产环境。

要了解为什么模拟器可以成为性能测试的宝贵工具,需要对负载有所了解。 利特尔定律表示,平均负载(L)等于到达率(λ)乘以完成交易所需的平均时间(T)。 因此,L =λT。

如果应用程序花费1秒来响应请求,则每秒的请求数必须为1,负载才能达到平衡。 图6演示了在持续时间不变的情况下增加到达率时会发生的情况。 大多数前端负载测试工具都强调增加产生负载的到达率。

图6.恒定响应时间下每秒增加的请求
该图显示了在每秒不同请求负载下运行的应用程序,以及如何需要其他资源实例来交付所需的1响应/秒。

反之亦然,并说明了到达率在寄存器处没有变化,但是应用程序响应所需的时间减少了。 图7显示了当响应速率以恒定请求速率降低时的效果。

图7.每秒不变的请求,响应时间减少
该图显示,具有相同负载的相同资源显然可以提供不同的响应时间。

图6和图7在一个复杂的系统中都很常见。 重要的是要注意,请求速率和响应时间都会对负载产生重大影响。

负载测试通常强调通过增加访问应用程序的客户端的到达率(λ)来增加负载。 通常这是通过负载生成工具(例如Mercury Load Runner或IBM Rational Performance Tester)来完成的,但是它没有解决后端系统预期返回结果的平均事务时间(T)。 作为推荐的最佳实践,模拟器可以与性能模型结合使用,以通过使用性能模型确定每个接口的平均响应,并将这些响应时间编程到模拟器中来创建更类似于生产环境的性能测试。

性能模型文档可用于基于生产中现有的或预期的平均响应时间来记录每个生产系统的服务水平协议(SLA)。 这可以包括不同级别的请求速率的响应时间。 通常,每个请求的响应时间将随着每秒事务数(TPS)的增加而减少。 这些变化的响应时间可以包含在模拟器中,以更好地模拟预期的生产环境。

模拟器还可以通过模拟临时的“打“”或服务中的暂停或通过模拟预期的SLA之外的响应来启用负面性能测试方案,从而可以测量对相关系统的影响。 这种额外的测试级别可以在SDLC中更早地发现并解决问题。

技术实施概述

以下信息提供了模拟器框架的具体实现。 它利用Spring 2.0框架将以XML格式存储的响应数据转换为代表相关服务响应的普通Java对象(PO​​JO)。 该框架支持同时使用模拟器和仪表板进行单元测试服务。 模拟器框架包含以下定义的层:

网页服务

模拟器解决方案的基础框架由Web客户端和Web服务组成。 在主应用程序内部运行的Web客户端和模拟器的接收Web服务都是通过提供的WSDL生成的。 WSDL能够自动创建测试业务功能所需的请求和响应对象。

仪表板层

仪表板层包含用于收集客户端服务层用于生成请求对象的数据的用户界面组件。 除了收集信息外,仪表板还将显示与调用的模拟器服务相关的结果。 仪表板还可以用作运行状况检查工具,以在测试实际的Web服务时验证连接性和结果。

客户服务层

客户端服务层定义了实现类,这些实现类负责获取从仪表板传递的数据,创建请求对象以及调用指定的模拟器服务。

模拟器服务层

模拟器服务负责生成将返回给调用客户端服务的响应对象。 该层提取请求中提供的键值,该键值将传递给负责检索相关测试数据XML文件的流程层。 在此层内,可以在返回响应之前应用生成正确响应所需的任何业务逻辑。

处理层

处理层将使用模拟器服务提供的密钥来标识要检索的Spring XML文件。 检索文件后,Spring BeanFactory将使用XML文件,并将数据转换为已定义的POJO,然后将其返回到模拟器服务层。 流程层的另一个方面是引入了可以模拟不同类型事务延迟的处理延迟。

资料层

数据层是代表Web服务响应对象的XML文件的存储库。 该XML定义了一种创建JavaBean对象的简单且一致的方法,该方法可以由与spring-beans-2.0.dtd兼容的Spring BeanFactory进行管理。 XML文件的检索由Spring File System Resource处理,并使用Spring XmlBeanFactory类转换为已定义的POJO。

WebSphere资源提供者

WebSphere资源提供者将用作存储解决方案,用于维护模拟器解决方案中使用的动态配置值。 可以使用管理控制台添加,修改和部署值,从而为独立或群集环境提供易于维护的功能。

图8.模拟器框架图
该图显示了具有各种复杂应用程序元素的体系结构,包括Web服务模拟器,数据生成器和Spring XML文件系统信息库。

技术实施步骤

以下步骤详细说明了生成示例模拟器应用程序的过程:

  1. 从提供的WSDL生成Web服务工件。
  2. 创建仪表板UI组件以捕获输入。
  3. 映射RPC配置中的服务实现,方法和输入参数。
  4. 创建客户端实现以收集请求对象并将其传输到模拟器服务。
  5. 创建将业务规则应用于生成的响应对象的模拟器服务。
  6. 创建将转换为响应对象的Spring XML数据文件。
  7. 配置WebSphere Environment Provider值以支持该应用程序。

网络客户端和服务

Web服务是模拟器框架的基础。 先前定义的WSDL用于生成Web服务构件,该构件将基于Web服务构件提供,以提供执行模拟器业务案例所需的功能。 使用客户端实现此功能后,通常会建立基线WSDL并基于WSDL创建Web服务客户端。 可以使用以下步骤使用示例WSDL指导您完成Web服务的生成过程。

使用Rational Application Developer(RAD)平台,通过向导工具快速生成Web服务和客户机。

Web服务生成

  1. 在RAD中,创建一个新的Web项目,其中将包含Web服务和模拟器支持工件。
    图9.创建动态Web项目
    屏幕快照显示了在Rational Application Developer中创建Simulator项目
  2. 在项目的“ src”树下添加一个“ wsdl”文件夹。 添加代表要模拟的Web服务的WSDL。 添加与WSDL一起提供的关联的命名空间到包属性文件,该文件将用于生成服务和客户端。
    图10.支持资源文件
    屏幕快照显示了在项目树中创建文件夹和资源的过程
  3. 通过右键单击WSDL并选择Web服务>生成Java bean框架来生成Web服务 。 这将打开Web服务向导。
    图11.生成Java bean框架
    屏幕截图显示了RAD中展开的菜单,用于生成Java bean框架
  4. 验证Web服务向导设置。 通常使用默认值。
    图12.验证服务器,服务项目和EAR
    屏幕截图显示了RAD中服务组件的验证
  5. 选择将名称空间映射到包的选项,这将在生成的对象中提供更加用户友好的包结构。
    图13.验证源文件夹并选择自定义映射
    屏幕快照显示已选中“定义从名称空间到程序包的自定义映射”选项。
  6. 在单击“ 完成”之前,单击“ 导入”以导入名称空间和包。
    图14.将名称空间导入包定义
    屏幕快照显示了在RAD中为项目名称空间定义自定义映射

单击“ 完成”后 ,将生成Web服务的客户端和服务端所需的对象。 这些新对象将出现在以选定包名称创建的项目中。

模拟器仪表板

模拟器仪表板提供用于测试模拟器服务的UI组件。 对于每个要测试的Web服务,将创建一个JSP来捕获在客户端服务层中生成SOAP请求对象所需的所有必需数据。

仪表板层利用多种工具提供快速可用的功能,这些功能可帮助在模拟器解决方案中收集,检索和显示数据。 您将结合两个元素来构成仪表板:

  • Ajax — Ajax组件用于收集信息,与服务层进行通信以及呈现响应数据。
  • IBM Web 2.0 Feature Pack – RPC适配器Servlet — RPC适配器Servlet将Ajax请求映射到所需的服务实现和管理Http请求以及其中包含的数据的方法。 生成的bean由RPC适配器Servlet转换为JSON对象,然后可以使用Ajax在JSP中呈现。 (请参阅相关主题的下载。)
图15. RPC适配器和JSP到Web客户端调用流之间的关系
该图显示了Webphere Environment提供程序如何与JSP Ajax回调交互以提供模拟器端点

特定于模拟器的JSP

JSP将定义客户端服务实现所需的输入,以组成传递到模拟器的请求对象。 除了捕获必要的输入值之外,JSP还将使用callback函数与RPC Adapter配置中定义的指定实现进行交互。 模拟器返回的数据将使用将显示其的RPC Adapter servlet转换为JSON对象。

JSP包括以下内容:

  1. 从WebSphere Resource Provider检索缺省模拟器端点。 (在WebSphere Resource Environment Provider中讨论了Resource Provider配置。)
    <% String acctEndPoint=(String)
          EnvironmentProviderUtility.getWebServiceEnvironmentAttribute("AccountSearch.Endpoint"); %>
  2. 定义客户端服务生成SOAP请求所需的所有HTML输入字段。
  3. 创建映射到所需流程服务实现和方法的Ajax回调函数。
    getRpcDataAccountSearch ('AccountSearchImpl','getAccountsByEquipment', $('accountEndPoint').value, 
         $('equipId').value,'getAccountsByEquipment')
    图16.简单的仪表板JSP
    仪表板的屏幕快照,其中包含用于输入模拟器端点的字段以及要传递给客户端的输入值

RPC适配器Servlet配置

必须使用以下步骤以及IBM Web 2.0 Feature Pack中提供的文件在模拟器项目中配置RPC适配器Servlet。

  1. IBM Web 2.0 Feature Pack – RPC适配器Servlet —通过编辑web.xml文件并添加RPX Adapter Servlet定义,在模拟器项目中注册IBM WEB 2.0 Feature Pack – RPC Adapter Servlet。 清单1显示了web.xml文件中IBM RPC Adapter servlet的注册。
    清单1.将RPC适配器Servlet定义添加到web.xml
    <servlet>
        <description> IBM WEB 2.0 Feature Pack - RPC Adapter </description>
        <display-name>RPCAdapter</display-name>
        <servlet-name>RPCAdapter</servlet-name>
        <servlet-class>com.ibm.websphere.rpcadapter.RPCAdapter</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>RPCAdapter</servlet-name>
        <url-pattern>/RPCAdapter/*</url-pattern>
    </servlet-mapping>
  2. 将RpcAdapterConfig.xml文件添加到WEB-INF文件夹。 RpcAdapterConfig.xml文件在IBM Web 2.0 Feature Pack中提供。
    图17.将RpcAdapterConfig.xml添加到WEB-INF文件夹
    屏幕截图显示了项目树中的RpcAdapterConfig.xml
  3. 在RpcAdapterConfig.xml文件中映射Simulator服务实现和方法。

通过此配置,RPCAdapter知道要从调用JSP调用哪个实现。 在清单2中, <pojo>下的<name>值注册了要在JSP中引用的实现。 <method>下的<name>值注册了JSP使用的实现方法; <parameter>下的<name>值注册要传递到实现方法上的输入值。

清单2.定义所有pojos,实现,方法和参数
<services>
    <pojo>
        <name>AccountSearchImpl</name>
        <description>com.simulator.service.AccountSearchImpl</description>
        <methods filter="whitelisting">
            <method>
                <name>getAccountsByEquipment</name>
                <description>web service method to retrieve account information by
                equipment id</description>
                <parameters>
                    <parameter>
                        <name>request</name>
                        <description>end point for account search simulator service</description>
                    </parameter>
                    <parameter>
                        <name>equipId</name>
                        <description>the equipment id used as key for retrieving simulator
                        data</description>
                    </parameter>
                </parameters>
            </method>
        </methods>
    </pojo>
</services>

客户端服务层(模拟器)

模拟器客户端服务层由Web服务客户端和与模拟器Web服务进行交互所需的实现类组成。 实现类从关联JSP中收集的数据构建特定于模拟器的SOAP请求,并将信息转发到由作为映射的WebSphere Environment Provider值检索的端点确定的映射的模拟器Web服务。 RPC适配器servlet将响应对象转换为JSON对象,并在调用JSP中将其呈现回用户。

在清单3中, equipment.setSim(equipId)输入到JSP中的值填充请求对象。 endPoint值定义为WebSphere Environment Provider值。

清单3.传递给模拟器服务的示例请求对象
public ESIGetAccountsByEquipmentResponseType getAccountByEquipment (
    HttpServletRequest request, String endPoint, String equipId) {

String method = "getAccountsByEquipment";
ESIGetAccountsByEquipmentResponseType rc = new ESIGetAccountsByEquipmentResponseType();
ESIGetAccountsByEquipmentResponseType req = new ESIGetAccountsByEquipmentRequestType();
Equipment equipment = new Equipment();
equipment.setSim(equipId);
req.setEquipment(equipment);

try {

    InitialContext jndiContext = new InitialContext();
    AccountSearch service = (AccountSearch) jndiContext
        .lookup("java:comp/env/service/AccountSearch");
        
    AccountSearchPort port = (AccountSearchPort)service.getPort(AccountSearchPort.class);
    ((Stub)port)._setProperty(Stub.ENDPOINT_ADDRESS_PROPERTY, endPoint);

    rc = port.getAccountsByEquipment(req);
    
} catch (java.lang.Exception e) {
    String[] variables = new String[] { e.getLocalizedMessage() };
    java.text.MessageFormat form = new java.text.MessageFormat(
        "Remote system error occurred, message is [{0}]");
    String formattedText = form.format(variables);
    logger.logp(WsLevel.SEVERE, CLASS_NAME, method, formattedText, e);
    return rc;
}
logger.exiting(CLASS_NAME, method, rc);
return rc;

}

模拟器服务层

在模拟器服务层中,从请求对象中提取了一个“事务”键,该键将用于确定要检索,使用和作为POJO响应返回的特定XML文件。 在清单4中,从请求对象中提取了设备ID,并将其作为XML检索键传递给流程层。 在此层内,可以在返回响应之前应用验证用例所需的任何业务逻辑。

同样在清单4中,第一个try语句从请求中传递一个关键字,生成器将使用该关键字来定位将被转换为响应POJO的XML文件。

清单4.数据生成器层使用的来自请求对象的构建键来定位Spring XML文件
public ESIGetAccountsByEquipmentResponseType getAccountsByEquipment(
        ESIGetAccountsByEquipmentRequestType getAccountsByEquipmentInput)
            throws java.rmi.RemoteException {
            
    String methodName = "getAccountsByEquipment";
    
    // return object
    ESIGetAccountsByEquipmentResponseType rc = new
    ESIGestAccountsByEquipmentResponseType();
    
    // request value used for simulator xml retrieval key
    String sim = getAccountsByEquipmentInput.getEquipment().getSim();
    
    if (log.isLoggable(WsLevel.FINER) {
        log.entering(className, methodName);
    }
    
    try {
    
        rc = (ESIGetAccountsByEquipmentResponseType) com.simulator.DataGenerator
                .getDataByBeanId(
                        "ESIGetAcountByEquipmentResponseType",
                        ACTION_KEY_EQUIPMENT, sim);
        return rc;
    } catch (org.springframework.beans.factory.BeanDefinitionStoreException ioe) {
        
        // return default equipment response
        rc = (ESIGetAccountsByEquipmentResponseType) com.simulator.DataGenerator
                .getDataByDefault("ESIGetAccountsByEquipmentResponseType",
                        ACTION_KEY_EQUIPMENT, DEFAULT_EQUIPMENT_CODE);
        log.logp(WsLevel.SEVERE, className, methodName, ioe
                .getResourceDescription());
        return rc;
    } catch (Exception e) {
        rc.setStatus(getCommonStatusType(e));
        return rc;
    } finally {
        if (log.isLoggable(WsLevel.FINER)) {
                log.exiting(className, methodName);
        }
    }
}

处理层

处理层采用入站密钥,该入站密钥将用于识别要检索的Spring XML文件。 检索文件后,SpringBeanFactory将使用XML文件并将数据转换为已定义的POJO。 如果无法找到请求的XML文件,Spring将抛出一个包装的IO异常。 在这种情况下,可以定义默认XML文件并返回它,这是在方案中定义“默认”行为时的有用过程。 另一个方面是引入处理延迟以模仿事务延迟。 在这种情况下,恒定等待时间值将存储为WebSphere Environment Provider值。

在清单5中, bf.getBean(clazzName)基于从模拟器服务提供的键检索数据XML。 注意,还有一个延迟注入检查,其值由WebSphere Envrionment Provider定义。

清单5.数据XML和延迟注入的示例检索
// Method used for retrieving spring xml
public static Object getDataByBeanId(String clazzName, String action, String key) throws
Exception {
    
    String dataFile = null;
    Object response = null;
    
    // check if service is "enabled"
    if ((ACCOUNT_SEARCH_ENABLED_KEY != null) && (ACCOUNT_SEARCH_ENABLED_KEY != "")
            && (ACCOUNT_SEARCH_ENABLED_KEY.equalsIgnoreCase("FALSE"))) {
        throw new Exception("service is disabled");
    }
    
    dataFile = getFile(action, key);
    
    com.simulator.SpringContext stsc = new com.simulator.SpringContext (
            dataFile);
            
    org.springframework.beans.factory.BeanFactory bf = stsc
            .getBeanFactory();
            
    // retrieve pojo
    response = bf.getBean(clazzName);
    
    // check i latency has been injected
    if ((ACCOUNT_SEARCH_LATENCY_KEY != NULL) && (ACCOUNT_SEARCH_LATENCY_KEY.length() !=
    0)) {
        sleep(ACCOUNT_SEARCH_LATENCY_KEY;
    }
    
    return response;

资料层

数据层由已定义的XML文件组成,这些文件将由Spring框架使用,并以POJO的形式返回给模拟器服务层。 清单6中的POJO是典型JavaBean的示例,可用于将数据层连接到Spring框架内的XML。 POJO利用简单的getter和setter使用框架将XML绑定到Java bean。

清单6.一个简单的JavaBean定义的示例
* AccountSummaryType.java..

package com.simulator.eo.account.accountsearch;

public class AccountSummaryType {
    private java.lang.String ssn;
    
    publicAccountSummaryType() {
    }
    
    public java.lang.String getSsn() {
        return ssn;
    }
    
    public void setSsn(java.lang.String ssn) {
        this.ssn = ssn;
    }

清单7提供了一个Spring XML示例示例,表示清单6中所示的JavaBean。

清单7.表示JavaBean的示例Spring XML
<?xml version="1.0" encoding="UTF-8"?>
<beans  xmlns=http://www.springframework.org/schema/beans
        xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
        xsi:schemaLocatin="http://www.springframework.org/schema/beans  
        http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
    <bean name="ESIGetAccountsByEquipmentResponseType"
        class="ESIGetAccountsByEquipmentResponseType"
            <property name="accountSummary">
           <bean class="com.simulator.eo.account.accountsearch.AccountSummaryType">
             <property name="ssn" value="ssn"></property>
           </bean>
            </property>
    </bean>
</beans>

WebSphere Application Server配置

为了支持模拟器框架,需要更改WebSphere Application Server配置。 模拟器利用WebSphere的资源环境提供程序存储模拟器应用程序中使用的应用程序值。 资源环境提供程序的优点是它允许将特定于环境的变量存储在Application Server中,而不是存储在属性文件中。 下面的示例演示了模拟器的帐户搜索服务属性的配置。 这些步骤定义了模拟器资源环境提供程序及其属性值。 你可以阅读更多关于这个“使用在WebSphere Application Server资源环境提供”(请参阅相关信息中的链接)。

WebSphere资源环境提供程序

要设置WebSphere Resource Environment Provider,请执行以下步骤:

  1. 登录到WebSphere Admin控制台,并使用向左导航到“ 资源”>“资源环境提供程序”
  2. 单击“ 新建”,然后输入环境提供程序(即Simulator Environment Provider)的名称。
    图18.定义模拟器环境提供者
    屏幕快照显示wsadmin屏幕,该屏幕为模拟器定义了资源环境提供程序

使用以下步骤来设置WebSphere Resource Environment Provider – Referenceables:

  1. 单击新环境提供者的名称,以导航到资源>资源环境提供者>模拟器环境提供者>可引用对象
  2. 单击“ 新建”以输入新的工厂名称和类名称。 输入值:
    • com.simulator.EnvironmentProviderFactory作为工厂类名称
    • com.simulator.EnvironmentProvider作为类名
    图19.在环境提供者可引用对象中定义工厂和类
    wsadmin的屏幕快照,显示可引用对象的配置

使用以下步骤来设置WebSphere Resource Environment Provider-Resource env条目:

  1. 单击“模拟器环境提供程序”的面包屑条目,然后导航到“ 资源”>“资源环境提供程序”>“模拟器环境提供程序”>“资源环境条目”
  2. 单击新建,然后输入以下信息。
    • 模拟器配置作为名称
    • rep / SimulatorConfig作为JNDI名称
    • 模拟器配置属性作为描述
    图20.定义资源环境条目
    wsadmin的屏幕快照,显示用于模拟器配置的Resource env条目的配置

使用以下步骤来配置WebSphere Resource Environment Provider –定制属​​性:

  1. 单击新创建的资源环境条目“ Simulator Configuration”的标题,然后导航到“ 资源”>“资源环境提供者”>“ Simulator Environment Provider”>“资源环境条目”>“ Simulator Configuration”>“ Custom properties”
  2. 单击New,然后输入信息,如表1所示。结果将类似于图21中的窗口。
表1.定制属性定义的值
名称 描述 需要
AccountSearch.Endpoint http:// localhost:10000 / Simulator / services / AccountSearch 模拟器端点
模拟器目录 C:\\模拟器\\ xml \\ 模拟器数据目录
AccountSearch.Latency 500 潜伏值
AccountSearch.Folder 帐户\ 资料夹
AccountSearch.Prefix 法案 文件前缀
AccountSearch.Enabled 真正 启用状态
图21.定义应用程序使用的定制属性
wsadmin中完成的定制属性的屏幕快照
  1. 注册资源环境参考: WebContent> WEB-INF>编辑添加资源环境参考的web.xml
    图29. web.xml中的资源环境参考
    屏幕截图显示了Web应用程序正在引用的ResourceEnvRef rep / Simulator。

These configuration values are now retrievable from the code in the Java objects or the JSP. This is used instead of property files in this example because the values can be managed through the admin console and synchronized across the cluster from the console.

结论

Simulators provide a convenient way to develop and test against systems that are not always available or are unable to support the full testing requirements of the system. The simulator framework provides a mechanism for quickly adopting the use of the simulator best practice, including the use of the service dashboard to monitor simulated and live back-end services. Simulators are an obvious choice during development when live services are unavailable or unreliable, but are also a valuable testing mechanism for functional and performance testing, including the ability to model SLAs using latency injection. The simulator framework may appear to be too complex and time consuming at first, but it has been proven over numerous project life cycles that this investment during development significantly reduces overall project effort and risk while increasing the quality of unit, functional, and performance testing.


翻译自: https://www.ibm.com/developerworks/web/library/wa-aj-simulator/index.html

web配置spring框架

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值