内容


使用动态缓存提升 WebSphere Process Server 和 WebSphere ESB 解决方案的性能

Comments

关于本教程

本教程基于一个检索并返回地点明细的虚拟服务。您可以将该服务想象成一个房间预定系统的一部分,其中系统的校园和设施信息从别处获得。您确定校园设施信息很少变化,因此您考虑完全可以用本地缓存来实现这个特别的服务。当地点明细数据发生变化时,您还将学习如何使缓存条目失效并清除缓存。

目标

您将学会如何:

前提条件

本教程假设您对 Java™ 编程语言有一定了解,熟悉 SCA 编程模型,对 WebSphere® Integration Developer 中的 WSDL 接口、数据类型、SCA 组件以及集成测试客户端的使用比较熟练。

系统需求

本教程使用 WebSphere Integration Developer V6.2.0.2 开发。但是,代码能在各版本产品中编译运行,包括即将发布的第 7 版。

学习时间

学习本教材大约需要 1 小时。

定义服务接口

在本部分,您将着手准备访问服务所需的接口和数据类型。

任务 1: 新建 WebSphere Integration Developer 项目

  1. 启动 WebSphere Integration Developer,新建一个工作区,并切换到 Business Integration 视图。
  2. 使用 File -> New -> Module 菜单, 将模块命名为 CachingTutorial,保留默认项,单击 Finish

任务 2:创建服务接口和消息类型

  1. 您将会用到四种数据类型表示请求和响应信息:
    • LocationBasicInfo
    • Address
    • Facility
    • LocationDetails
  2. 在 Business Integration 视图中右键单击 Data Types 文件夹并选择 New -> Business Object 新建一个数据类型。
  3. 将新建的业务对象命名为 LocationBasicInfo。此数据类型表示请求 消息并包含用以检索地点明细的地点 ID。
  4. 为该对象添加两个字符串类型的属性,并分别命名为 idname。使用 Add Field 工具添加属性,如图 1 所示。
    图 1. 请求消息
    请求消息
  5. 接下来,创建其余的三个业务对象,它们合起来组成响应数据结构。请特别注意 LocationDetails 上的 “Facilities” 字段,它是一个 Facility 类型对象的数组(图 2)。
    图 2. 响应消息
    响应消息
    响应消息
  6. 最后,创建服务接口。您可以通过右键单击 Interfaces 文件夹完成。将接口命名为 LocationService,创建一个名为 retrieveLocationDetails 的请求-响应操作,它有一个类型为 LocationBasicInfo、名为 request 的输入参数和一个类型为 LocationDetails、名为 response 的输出参数(图 3)。
    图 3. 服务接口
    服务接口
    服务接口

    现在,您已经有了请求和响应数据结构的定义,以及对服务接口及操作的描述。

    我故意将响应消息的结构设计成像 LocationDetails 这样。响应对象将最终存储在缓存中,我想展示一下我们的缓存解决方案处理各种数据结构的能力。如果您再次查看 图 2,您将看到响应对象包含一个简单类型(String 类型的 name),一个复杂类型(Address 类型的 address)和一个 序列(Facility 类型对象数组 facilities)。

构建缓存组件

在本部分中,您将学习如何通过创建一个 Java 组件来构建一个透明缓存。这个 Java 组件实现了与目标服务相同的接口,并能与 WebSphere 动态缓存服务交互。

  1. 在 Business Integration 视图中右键单击打开 Assembly Diagram。您可以检查刚创建好的业务对象和接口。它们会显示在 Business Integration 视图中,如图 4所示。
    图 4. Business Integration 视图
    Business Integration 视图
  2. 在 Assembly Diagram 中创建一个 Java 组件。将此组件命名为 CachingComponent 并使用它的弹出工具栏添加一个接口和对该组件的引用。为两者使用 LocationService 接口。保存装配图。参考图 5 中完成的装配。
    图 5. 完成的装配
    完成的装配
    完成的装配

    对本教程来说,装配已经完成,现在已完成一个工作模块用于测试。在实践中,目标服务位于别处,您可以通过使用 Import 来绑定。您也可以在使用 Export 把服务暴露给客户前使用中介模块来调停请求和响应。

    在这种布局下,客户将绑定到您的模块输出上。在输出和中介模块之间插入缓存组件对服务使用者是完全透明的。
  3. 双击缓存组件生成其实现。这将为 retrieveLocationDetails 操作生成一个 stub 方法,这个操作将在稍后实现。
  4. 在实现接口操作前,您需要创建一个静态类成员和静态类方法来查找默认 DynaCache 对象的缓存实例(清单 1)。
    清单 1. 默认对象缓存实例
    private static DistributedObjectCache cache = initCache();
    static DistributedObjectCache initCache(){
      try {
        InitialContext ic = new InitialContext();
        return (DistributedObjectCache) ic.lookup("services/cache/distributedmap");
      } catch (NamingException e) {
        e.printStackTrace();
        return null;
      }
    }
  5. 将清单 2 中的导入添加到类中。
    清单 2. 缓存组件导入
    import javax.naming.InitialContext;
    import javax.naming.NamingException;
    import com.ibm.websphere.cache.DistributedObjectCache;
  6. 既然有了对 DynaCache 对象缓存实例的引用,您必须实现该接口操作,如清单 3 所示。
    清单 3. 接口操作实现
    public DataObject retrieveLocationDetails(DataObject request) {
    
    // retrieve key to cache from the request
    String key = request.getString("id");
    	
    DataObject responseObject = null;
    
    // get response from cache
    responseObject = cache == null ? null : (DataObject) cache.get(key);
    
    // if cache miss invoke service and update cache
    if (responseObject == null) {
    	DataObject responseMessage = (DataObject)
    locateService_LocationServicePartner().invoke("retrieveLocationDetails", request);
    responseObject = responseMessage == null ? null :
    responseMessage.getDataObject("response");
    
    	if ((cache != null) && (responseObject != null)) {
    		cache.put(key, responseObject);
    	}
    }
    return responseObject;

    现在花点时间来理解这段代码。作为 WebSphere Process Server 和 WebSphere ESB 运行时架构基础的 WebSphere Application Server 提供了一种分布式的缓存基础架构和 API。

    可以使用 JNDI 名称 services/cache/distributedmap 找到现成的默认对象缓存实例。对于本教程来说,使用该实例是可以的,但在生产系统中,最佳实践是为您想缓存响应的每个服务创建一个专用实例。这将保证缓存实例的独立性,并为禁用缓存条目和清空缓存提供了更细的粒度。参考资料 部分提供对使用对象缓存实例和 WebSphere 缓存 API 更深入的讨论。

    接口方法将会从请求中检索 id 属性,然后将其用作从缓存中检索响应的键值。如果未找到对应的响应,代码将调用服务伙伴。
  7. 保存并关闭 Java 编辑器。

测试缓存组件

在本部分,您将模块部署到测试服务器上并确认服务缓存能按要求运行。

  1. 在装配图中,右键单击 CachingComponent 并选择 Test Component
  2. 在 Initial Request Parameters 面板中,填充请求 ID 并继续测试,确认部署位置。此时,测试服务器将启动,模块也将自动部署。
  3. 测试客户端提供了对组件引用的手动模拟器。当调用引用时,需要手动模拟服务。进入模拟器的 Output Parameters 部分并输入响应值,包括设施列表中的一些元素,然后继续测试。
  4. 一旦测试完成,请注意 Events 面板(图 6),这上面显示了模拟服务。
    图 6. 首次运行 — 来自服务的响应
    首次运行
    首次运行
  5. 返回测试并使用相同的请求 ID。这一次,模拟器将不会执行。请再看一下图 7 中显示的事件。请注意缓存组件不再需要调用其服务伙伴,因为它现在已在动态缓存中找到与请求 ID 对应的响应信息。
    图 7. 再次运行 — 来自缓存的响应
    再次运行
    再次运行
  6. 最后,第三次运行测试,但这次使用不同的请求 ID。这次,引用模拟器再次运行,您需要输入新的响应值。图 8 显示的是第三次运行后的事件面板。
    图 8. 第三次运行 — 来自服务的响应
    第三次运行
    第三次运行

使用缓存条目以及清空缓存

作为可安装应用程序 的一部分,同时提供的还有缓存监视器应用程序。缓存监视器用作监视 servlet 缓存实例。为了能监视对象 缓存实例, 您需要参考 IBM Extended Cache Monitor for IBM WebSphere Application Server 技术前瞻 来扩展此应用程序。

缓存监视器应用程序安装并更新后,您就可以从 Web 浏览器访问缓存监视器,方法是打开 Web 浏览器,输入 URL:http://localhost:9080/cachemonitor/。实际端口可能有所不同。

缓存监视器使用的验证凭证与管理控制台相同,WebSphere Integration Developer 默认安装后通常是 “admin/admin”。

  1. 从下拉列表中选择 default 缓存实例并单击 OK。如果默认实例未显示,需要单击 Refresh Instances(图 9)。

    注意:一旦测试执行,默认缓存实例只能生成一次。 在使用缓存监视器前,一定要确认完成了 测试缓存组件 部分的操作。
    图 9. 默认缓存实例
    默认缓存实例
    默认缓存实例
  2. 单击 Cache Statistics 并仔细研究图 10 中的表。缓存中有两个使用过的条目。其中一个请求已由缓存服务,两个请求未被缓存的响应满足。请注意 Clear Cache 按钮,它可以清空缓存。可以通过重启服务器清空缓存,或者使用 clear() 方法以编程方式清空缓存,详见 DistributedObjectCache API
    图 10. 缓存统计
    缓存统计
    缓存统计
  3. 最后,单击 Cache Contents。在该面板中(图 11),您将看到两个缓存条目,它们的 ID 是在请求中使用的。可以在缓存内容面板中设置各缓存条目无效。
    图 11. 缓存内容
    缓存内容
    缓存内容

还有许多参数和策略设置可以应用到缓存实例以控制多个属性,如缓存大小、缓存条目回收标准、允许缓存条目卸载到二级存储、缓存条目相关性、缓存条目超时以及其它。

关于缓存管理的更多信息,请参考 使用对象高速缓存实例

结束语

在本教程中,您学习了如何从 SOA 的视角来使用 WebSphere Dynamic Cache 服务。您完成了一个服务,其响应信息被缓存以提高解决方案的性能。您还学习了如何使用 WebSphere Integration Developer 构建一个透明的 SCA 缓存组件。您还测试了该缓存组件,学习了如何监视并管理缓存。另外,本教程还讨论了使用对象缓存实例的最佳实践。


下载资源


相关主题


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=WebSphere, SOA and web services
ArticleID=474433
ArticleTitle=使用动态缓存提升 WebSphere Process Server 和 WebSphere ESB 解决方案的性能
publish-date=03152010