内容


简化中介

使用 E4X 和示例代码编写 SIBus 中介

Comments

引言

WebSphere Application Server Web 服务和消息传递

IBM WebSphere Application Server V6 (WebSphere Application Server) 引入了服务集成总线(Service Integration Bus,SIBus)支持。SIBus 支持松散耦合的应用程序和服务之间的集成。应用程序连接到 SIBus ,并受到使用基于消息和面向对象的体系结构的支持。SIBus 安装可以有多个目的地。目的地是一些可以具有服务端点、队列或者主题的行为的逻辑地址。最重要的是,目的地是活动的。换句话说,在消息通过目的地时,目的地可以对消息执行工作。这是通过将中介 连接到目的地来实现的。

SIBus 通过入站 (Inbound) 和出站 (Outbound) 服务定义来支持 Web 服务。这些服务定义对如何将目的地公开为 SOAP 端点以及此端点如何与其他 SOAP 端点交谈进行了定义。SIBus 外部的 Web 服务客户机可以向入站服务发送请求,而且可以通过向出站服务发送请求来从 SIBus 内部调用其外部的 Web 服务。然后,可以通过中介路由和转换 SIBus 中在入站服务和出站服务之间流动的 Web 服务消息。

SIBus 还支持混合和匹配 方法,可以通过这种方法来路由和协调 SOAP/HTTP 和 JMS 消息。例如,消息可以作为 SOAP/HTTP 消息传入,然后发送给 JMS 使用者。在这种情况下,中介框架的作用非常重要,因为它允许修改消息,以使之与通信的每个终端相匹配。

建议您阅读参考资料部分中列出的关于此主题的两篇文章:“Working with the Enterprise Service Bus and Mediations”和“Building an Enterprise Service Bus with WebSphere Application Server”。

XML 语言 E4X

ECMAScript for XML (E4X) 是对 JavaScript 语言的扩展,它增加了对 XML 的直接支持。它允许您在无需使用任何其他的 XML 库或 API 的情况下,直接从 JavaScript 创建、操作和使用 XML。这使得通过 EX 处理 XML 比通过其他方式(如 DOM)处理 XML 简单和容易得多。而且对于大多数 Java 和脚本编程人员来说,它也是一种比 XSLT 更为自然的编程模型。强烈推荐您阅读参考资料中引用的以前的 developerWorks 系列文章“AJAX and scripting Web services with E4X, Part 1: Introducing E4X”。

在本文中,我们向您展示如何将 E4X 用于 SIbus 中介。我们还将展示,在与软件包示例代码组合时,采取这种方式可以迅速开发出功能强大的 SIBus 中介流。

WSMediations 软件包

WSMediations 软件包提供了一个简单的框架,可以使 SIBus 中介变得易于使用。由于它采用约定优于配置 的方法,因而最大限度地减少了建立中介所需的工作。这个特性与 E4X 脚本的简单性结合在一起,使得创建新的中介流的速度比使用 Enterprise JavaBeans (EJB) 和 XSLT 转换从头开始实现流快得多。

WSMediations 软件包使用一个单独的中介 EJB,该 EJB 是基于其运行的目的地为每个中介自定义的。中介是以 E4X 脚本的形式编写的,该脚本保存在 WebSphere Application Server 共享库中。这意味着,更新脚本时只需更新共享库中的 JAR 文件,而无需重新构建和重新部署 EJB。脚本的命名方式和与其关联的目的地的命名方式相同,这样,一个中介 EJB 无需进行任何特别的配置,就可以自动发现要在每个中介目的地运行的脚本。

虽然 SIBus 允许存在两个维数的中介流(流过目的地的流 每个目的地的中介链的流),但为了简单起见,我们选择在每个目的地支持一个中介,并建议将中介 定义为多个目的地。

为了加深印象,我们鼓励采取这样一种 SIBus 使用模式,其中,中介是通过一组特殊的目的地来定义的,这些目的地的唯一用途就是协调消息。

WSMediation 框架提供的脚本环境扩展了标准的 WebSphere Application Server 中介 API,以提供获取和设置消息的 XML 表示的简化方法。这使得可以方便地使用 E4X 访问和转换消息。对于来自或发往 SIBus 入站服务和出站服务目的地的基于 SOAP 的 Web 服务消息,在消息转换之后,中介框架可以自动确定新的服务数据对象(Service Data Object,SDO)格式字符串。这样就可以非常容易地编写转换代码。

遵循三个简单步骤即可创建一个新的中介:

  1. 创建一个新的 SIBus 目的地。
  2. 通过 WSMediation EJB 对其进行协调。
  3. 将一个具有与目的地相同的名称的中介脚本添加到脚本共享库中。

配置 WebSphere Application Server 使用 WSMediations 软件包。

在使用 E4X 和 WSMediations 之前,您必须完成下列步骤,将 WSMediations 软件包安装到 WebSphere 中:

  • 安装 WSMediations EAR 文件。
  • 将 WSMediations EJB 定义为中介处理程序。
  • 创建一个用于存放中介脚本的 WebSphere Application Server 共享库。
  • 添加 xbeans.jar 并替换 WebSphere Application Server 库目录中的 js.jar(以提供 E4X 支持)。

ws-mediationcode.zip 文件中的自述文件详细描述了这些步骤,您可以从本文下载 ws-mediationcode.zip 文件。

CurrencyStock 编排示例

既然我们已经解释过所有的部分,并且将 WSMediations 代码安装到 WebSphere Application Server 中,我们可以开始编写中介了。为了演示如何使用简化的中介,我们将向您展示如何从现有服务的编排 创建一个新的 Web 服务。该编排是一个有效的新服务,其逻辑完全是由“粘接”在一起的现有服务提供的。这个例子与“AJAX and scripting Web services with E4X”系列的第 2 部分中的相同(请参阅参考资料),但这一次,我们使用的是 WebSphere Application Server SIBus 运行时而不是 Apache AXIS。如果您还没有阅读这篇文章(为什么不读呢!?),我就介绍一下,这个简单的服务使用两个现有的服务——一个股票报价服务和一个货币服务——并提供一个新的服务——以您的本地货币来进行股票报价。

创建了两个 SIBus 出站服务,一个用于 xMethods stockquote 服务,另一个用于 xMethods 货币汇率服务。然后,我们使用一个 SIBus 入站服务来公开一个新的 currencystock 服务,该服务支持外部 Web 服务客户机获取根据货币调整的股票价格。在本例中,SIBus 中介用于将 CurrencyStock 请求转换为两个对 xMethods StockQuote 和货币转换服务的新请求,接着并行执行这两个服务。最后,另一个中介将两个 xMethod 响应合并到一个 CurrencyStock 响应中,该响应返回到最初的 Web 服务客户机。

图 2 显示了此编排配置。

用于创建 CurrencyStock 编排的 WebSphere Application Server SIBus 资源

图 2 用于编排的 SIBus 服务和中介
用于编排的 SIBus 服务和中介
用于编排的 SIBus 服务和中介

配置 WebSphere Application Server 资源

创建出站服务:

  • 创建位于 http://services.xmethods.net/soap/urn:xmethods-delayed-quotes.wsdl 的 xmethods stockquote 服务。
  • 创建位于 http://www.xmethods.net/sd/2001/CurrencyExchangeService.wsdl 的 xmethods 货币转换服务。

由于缺省情况下生成的出站服务和目的地名称不太实用,因此在命名出站服务和目的地 面板中定义出站服务时,您应该将缺省的服务名称和目的地名称分别更改为xmethodsStockquotexmethodsCurrency

创建中介目的地:

  • CurrencyStockIBS
  • StockquoteXForm
  • CurrencyXForm
  • CurrencyReply
  • MergeReplies

将 WSMediation 与 CurrencyReply 目的地之外的所有目的地连接起来。

为新的 CurrencyStock 服务定义 SIBus InboundService:

  • 使用 CurrencyStockIBS 目的地和可下载的压缩文件 ws-mediationcode.zip 中提供的 CurrencyStockquote.wsdl。

最终的 WebSphere Application Server 目的地应如图 3 所示的 wsadmin 面板。

图 3. 带有最终的 WebSphere Application Server 目的地的 wsadmin 面板
带有最终的 WebSphere Application Server 目的地的 wsadmin 面板
带有最终的 WebSphere Application Server 目的地的 wsadmin 面板

配置的最后一部分是在一些新的目的地设置转发和反转路由路径:

  • CurrencyStockIBS frp=:StockquoteXForm replyDest=MergeReplies replyBus=dWESB
  • StockquoteXForm frp=:xmethodsStockquote
  • CurrencyXForm frp=:xmethodsCurrency replyDest=CurrencyReply replyBus=dWESB

图 4 展示的 wsadmin 面板显示了如何在目的地配置路由路径。

图 4. 配置目的地的转发和应答目的地
配置目的地的转发和应答目的地
配置目的地的转发和应答目的地

中介 E4X 脚本

现在,需要做的工作只剩下创建中介脚本并将其添加到脚本共享库中了。

清单 1 显示了与 CurrencyStockIBS 目的地关联的中介脚本。第 3 行复制了当前消息,第 4 行将复制的消息发送到 CurrencyXForm 目的地,而第 6 行返回的 true 意味着当前消息将继续发送到转发路由路径中的下一个目的地(StockquoteXForm 目的地)。

此复制脚本将 CurrencyXForm 目的地名称硬编码在其中。可以使用目的地上下文属性定义将要复制到的目的地,从而对脚本进行改进。WSMediations 框架提供的方法使脚本可以容易地访问目的地上下文属性(例如,MessageContext 上的 getDestinationProperty(key) 方法)。通过使用这些方法,您可以编写一个通用的中介,基于目的地上下文属性设置将消息复制到一个或多个其他目的地中。但为了使示例保持简单,我们采用这个简单的硬编码方式。

清单 1. CurrencyStockIBS 中介脚本
 1.  function process(mc) {
 2.  
 3.    var msg = mc.getSIMessage().clone();
 4.    mc.send(msg,"CurrencyXForm");
 5.  
 6.    return true;
 7.  }

清单 2 显示了与 StockquoteXForm 目的地关联的中介脚本。这段脚本将 CurrencyStock 请求转换为 xMethod StockQuote 请求,并展示了像 E4X 这样的 XML 编程语言使得处理 SOAP 消息变得多么地简单和清晰。

第 3 行和第 4 行从 CurrencyStock SOAP 请求中提取共享符号。第 6 行到第 14 行创建一个适合 xMethods StockQuote 服务的新 SOAP 信封。这是一个简单的从来自 xMethods Web 站点 的 SOAP 消息的复制-和-粘贴。第 11 行使用 E4X 花括号 {} 语法将第 4 行提取的共享符号插入到信封中。

第 16 行将新信封设置为消息上的有效负荷。使用 reformatPayload 方法告知 WSMediations 框架 SOAP 信封的结构已经更改,因此需要对 SDO 格式字符串进行重新计算。请参见侧栏对 SIBus 消息格式字符串的描述。

这里没有显示 CurrencyXForm 脚本,因为它几乎与 StockquoteXForm 脚本完全相同——只是更改了 SOAP 消息,以便与 xMethods 货币转换服务匹配。

清单 2. StockquoteXForm 中介脚本
 1.  function process(mc) {
 2.  
 3.     var origReq = mc.getPayload();
 4.     var symbol = origReq..*::symbol.toString();
 5.     
 6.     var envelope = 
 7.        <s:Envelope xmlns:sq="urn:xmethods-delayed-quotes" 
 8.                    xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
 9.           <s:Body>
10.              <sq:getQuote>
11.                 <symbol>{symbol}</symbol>
12.              </sq:getQuote>
13.           </s:Body>
14.        </s:Envelope>
15.  
16.     mc.reformatPayload(envelope);
17.     
18.     return true;
19.  }

清单 3 显示了与 MergeReplies 目的地关联的中介脚本。该脚本接收来自 StockQuote 和货币服务的响应,提取返回值,然后构造一个 CurrencyStock 响应 SOAP 消息。其工作方式与我们已经描述过的 StockquoteXForm 脚本非常类似,只是在第 6 行和第 7 行多了两个函数,用于接收来自 CurrencyReply 目的地的货币响应信息。这项工作是通过使用响应消息的关联 ID 来完成的,在此需要稍微解释一下:

一个 SIBus 消息有两个 ID——一个是消息 ID,另一个是关联 ID。在调用出站服务时,SIBus 服务调用者将响应消息上的关联 ID 设置为与请求消息的消息 ID 具有相同的值。这就将请求消息和相应消息链接到一起。当 eCurrencystockIBS 目的地上的复制脚本克隆请求消息时,产生的两个请求消息将具有相同的消息 ID。这意味着当 MergeReplies 脚本现在尝试接收货币响应信息时,它可以使用来自 StockQuote 响应的关联 ID,因为 StockQuote 请求和货币请求使用的是同一个消息 ID。

清单 3. MergeReplies 中介脚本
 1.  function process(mc) {
 2.  
 3.     var stockquoteEnvelope = mc.getPayload();
 4.     var ticker = stockquoteEnvelope..*::Result.toString();
 5.     
 6.     var correlationID = mc.getCorrelationID();
 7.     var currencyEnvelope = mc.receiveXML("CurrencyReply", correlationID);
 8.     var rate = currencyEnvelope..*::Result.toString();
 9.  
10.     var envelope = 
11.        <s:Envelope xmlns:cs="http://sample" 
12.                    xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
13.           <s:Body>
14.              <cs:getQuoteResponse>
15.                 <getQuoteReturn>{rate*ticker}</getQuoteReturn>
16.              </cs:getQuoteResponse>
17.           </s:Body>
18.        </s:Envelope>
19.  
20.     mc.reformatPayload("CurrentcyStockIBS", envelope);
21.  
22.     return true;
23.  }

测试新的 CurrencyStock Web 服务

大功告成!现在您可以从任何 Web 客户机对新的 CurrencyStock 服务进行测试。在示例下载中,您可以找到一个简单的 HTML 页面,该页面使用 E4X,因此它需要使用最新版本的 Mozilla 才能运行。另外,您也可以使用随 IBM Rational® Application Developer 一起提供的 Web services explorer 实用工具或者您喜爱的 Web 服务工具,从 currencystock.wsdl 创建一个 Web 服务客户机。

图 6 显示了一个 E4X Mozilla 客户机示例和请求的 IBM 股票价格的结果(以新西兰货币为单位)。您可以从其帮助页面(请参阅参考资料)获取 xMethods 货币汇率服务所支持的货币列表。

图 6. 利用 Mozilla 测试 CurrencyStock 服务
利用 Mozilla 测试 CurrencyStock 服务
利用 Mozilla 测试 CurrencyStock 服务

结束语

在本文中,作者向您展示了如何将一个简单的框架 (WSMediation) 与轻量级 XML 脚本编写语言 (E4X) 结合起来,完成简单而功能强大的 Web 服务路由和协调。这种方式的强大和简单使得以 WebSphere Application Server V6 为中心构建 ESB 的工作变得更加快捷和富有成效。


下载资源


相关主题


评论

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

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=SOA and web services
ArticleID=93041
ArticleTitle=简化中介
publish-date=08292005