在 IBM Integration Designer 中实现跨多个 WebSphere ESB 中介流的用户上下文

本文将介绍用户上下文的概念,描述如何在 WebSphere® ESB 流中实现它们。user 上下文是在多个 WebSphere ESB 流之间传递未包含在消息有效负载中的数据的惟一方法。

Philip J. McCormick, 软件工程师, IBM

Philip J. McCormick 的照片Phil McCormick 是英国 IBM 赫斯利软件实验室的 WebSphere ESB 团队的一名首席测试人员。他自 2009 年就开始在 WebSphere ESB 团队工作,在 IBM 已工作了 13 年,负责产品支持、构建、开发和测试。



Andrew Borley, 软件开发人员, IBM

Andrew Borley 的照片Andrew Borley 领导着英国 IBM 赫斯利软件实验室的 WebSphere ESB Development 团队。他自 2007 年开始在 WebSphere ESB 团队工作,在这之前,曾在 Apache Tuscany 工作过,研究过各种面向服务的体系结构项目。



2013 年 1 月 10 日

简介

您是否正在 IBM® Integration Designer(以下简称 Integration Designer)中编写中介流,以便将它们部署在 WebSphere Enterprise Service Bus (ESB) 上,并且需要在两个或更多中介流之间传递额外的信息?您可以通过阅读文档来决定使用哪些 “用户定义的上下文” 来完成此任务,并且您会选择使用用户上下文,因为它们似乎能够满足您的需求。

接下来,您打开中介流,查看 Integration Designer 窗口右侧的 Context 面板,看到了 Correlation、Transient 和 Shared 上下文,但没有看到用户上下文。这就引入了我们要讨论的问题,如何实际实现用户上下文?以下是一个分步指南,其中包含一个可供您试用的示例。

本文假设您有创建中介流并将它们部署到 WebSphere ESB 的经验。


系统前提条件

要部署本文中提供的 示例,您需要:

  • IBM WebSphere ESB V7.5.1 或更高版本
  • IBM Integration Designer V7.5.1 或更高版本

上下文概述

Service Message Object (SMO) 上下文支持中介原语在它们自身之间传输未包含在消息有效负载中的数据。SMO 上下文对象是用户定义的系统定义的

哪些是系统定义的上下文对象?

以下上下文对象是系统定义的:

  • failInfo:该上下文用于包含异常信息。
  • primitiveContext:该对象包含特定的中介原语使用的信息。
  • dynamicProperty:该对象用于覆盖提升的属性。

哪些是用户定义的上下文对象?

可使用用户定义的上下文对象来存储属性,以便中介原语在流中的后续阶段访问它们。以下上下文对象是用户定义的:

  • transient:使原语能够在当前流中彼此传递值。
  • correlation:使原语能够将值从请求流传递到它的响应流。
  • shared:在一个流的所有分支之间共享值。
  • user:在 SCA 组件之间传递未包含在消息有效负载中的值。

本文将指导您执行实现用户上下文的步骤。


实现用户上下文

在这一节中,我们将简单介绍实现用户上下文的步骤,然后更详细地介绍下一节中包含的示例。

不同于其他用户定义的上下文,实现用户上下文并不是简单地将一个业务对象添加到 Request、Response 或 Error 选项卡上右侧的上下文面板中(参见图 1)。

图 1. 上下文面板的位置
上下文面板的位置

在图 2 中,可以看到 Context 面板包含 Correlation、Transient 和 Shared 上下文,没有包含用户上下文。

图 2. 上下文面板
上下文面板

user 上下文使用 XSL Transformation 或 Business Object Map 原语配置,可在中介原语面板中的 Transformation 文件夹下找到它们(参见图 3)。

图 3. Transformation 原语
Transformation 原语

初始化用户上下文

执行以下步骤,让您的中介流为使用用户上下文做好准备:

  1. 在用户上下文中存储任何内容之前,需要引入一个 XSL Transformation 或 Business Object Map 原语。展开 userContext 部分,为 “entris” 部分创建一个 Local 映射(参见图 4)。您需要为您希望在 SCA 模块之间传递的每个值创建一个 Local 映射。
    图 4. 创建一个用户上下文条目
    创建一个用户上下文条目
  2. 在 Local 映射的属性中,在 Cardinality 中输入 1 作为第一个值,为第二个值输入 2,依此类推,如图 5 所示。
    图 5. 设置基数
    设置基数
  3. 指定一个名称,还可通过输入 Local 映射和使用 Assign 为您的值指定一个类型,如图 6 所示。
    图 6. 分配一个用户上下文名称和类型
    分配一个用户上下文名称和类型

    name 可根据您的希望随意分配,比如 MyUserContextName

    type 可以是描述在 value 字段中使用的类型的任何内容,比如 stringintboolean,或者 myBO 等复杂类型。

  4. 为 “value” 创建一个映射。Cast Assist 弹出窗口将会出现,如图 7 所示。单击 Cast target and map,然后选择您的数据类型。
    图 7. 设置用户上下文的值
    设置用户上下文的值
  5. 现在您已有一个针对您所选的数据类型的 Local 映射,如图 8 所示。
    图 8. 设置用户上下文的值(续)
    设置用户上下文的值(续)
  6. 要设置一个默认值,可将 Local 影射的值更改为 Assign,或者打开 Local 映射,并将 Assign 添加到该值中。

存储并读取用户上下文的值

在设置用户上下文的值的原语中,例如 Database Lookup 原语,确保为您的值指定了正确的类型,然后,按照清单 1 和图 9 所示设置 Target 位置。

清单 1. 您的用户上下文值的 Xpath
/context/userContext/entries[name = 'MyUserContextName']/value
图 9. 将数据库内容存储在用户上下文中
将数据库内容存储在用户上下文中

在读取和使用存储于用户上下文中的值的原语中,可以使用与在存储该值时相同的 XPATH(如图 9 所示)。


示例:扩展 Stock Quote 场景

您有一个企业像您的付费客户提供股票价格。可以提供两种会员级别:针对 “高级” 客户的金级会员和针对 “标准” 客户的银级会员。

当一个客户提交了对一支股票价格的请求时,消息的有效负载包含他们的用户 ID 和公司代号。然后,中介流会从一个数据库获取客户的详细信息,以适当的方式将它们转发给金级或银级服务。

但是,您现在向具有高信用评级的金级客户或已成为会员多年的金级客户推出了一项铂金级服务。确定一个金级客户能否使用铂金级服务的逻辑包含在一个与数据库查找独立的流中。

此场景基于 IBM Integration Designer 中的 Samples and Tutorials 帮助页面中的标准 Stock Quote 示例。我们更新了该场景,使用一个额外的中介模块来处理针对铂金级服务授权的检查。

以下各节将会详细介绍对最初的 Stock Quote 中介模块的更新、新的 Platinum Service Check 中介模块,以及自行运行示例的指令。运行此示例所需的文件包含在本文的 下载 部分。

StockQuote 中介模块

图 10 显示了 StockQuote 中介模块的更新的组装图。

图 10. 更新的 StockQuote 组装图
更新的 StockQuote 组装图

StockQuote 组装图已更新,将 RealtimeService Web Service Import 替换为新的 PlatinumServiceCheck SCA Import,如图 11 所示。

图 11. 更新的 StockQuote 中介流
更新的 StockQuote 中介流

StockQuote 请求中介流类似于最初的 StockQuote 中介流,但添加了一个名为 CreateUserContextEntries 的额外的 XSLTransformation 原语(参见图 11)。Database Lookup 原语(名为 Lookup)已更新,它使用来自数据库 CUSTOMERTABLE 表的额外数据扩充了 SMO。额外的数据是 YEARSASCUSTOMER 和 CREDITRATING 数据库列,它们存储在 SMO correlation 上下文中。

当打开 CreateUserContextEntries XSLTransformation 原语所使用的映射时,您可以看到一个类似图 12 的映射。

图 12. CreateUserContextEntries 映射
CreateUserContextEntries 映射

该映射包含两个将 correlation 上下文和消息正文移动到输出 SMO 中的移动操作。3 个本地映射操作创建了 3 个新的用户上下文条目,以便将作为一个客户的年数、客户信用评级值和客户 ID 值都传递给由 PlatinumServiceCheck 导入语句调用的新中介模块。

3 个本地映射很相似,它们为 3 个客户数据项中的每一个数据项都设置了一个名称-值对。user 上下文中存储成为客户的年数的本地映射,如图 13 所示。

图 13. 成为客户的年数的本地映射
成为客户的年数的本地映射

Platinum Service Check 中介模块

Platinum Service Check 中介模块已添加到最初的 Stock Quote 中介模块与 Realtime 服务之间的新解决方案中。图 14 显示了一个 SCA Export、一个中介模块和两个 Web 服务导出模块。第一个模块对 Realtime 服务进行了最后的调用,第二个模块调用存储请求的详细信息的铂金级服务。

图 14. Platinum Service Check 组装图
Platinum Service Check 组装图

在图 15 中,Platinum Service Check 模块的请求流是从一个 Flow Order 原语开始的,该原语将该流拆分为两个分支。第一个分支直接调用 Realtime 服务。然后,该流的第二个分支进入名为 PlatinumCheck 的 Message Filter 原语。

在 PlatinumCheck 原语中,对 SMO用户上下文运行了一个 XPath 表达式,以检查成为客户的年数是否大于或等于 5,或者客户的信用评级是否大于或等于 90。

图 15. Platinum Service Check 中介模块请求流
Platinum Service Check 中介模块请求流

PlatinumCheck 原语的细节页面如图 16 所示。使用的完整的 XPath 表达式如清单 2 所示。

图 16. PlatinumCheck 细节页面
PlatinumCheck 细节页面
清单 2. Xpath 表达式
/context/userContext/entries[name = 'CustomerYears']/value >= '5' 
or /context/userContext/entries[name = 'CreditRating']/value >= '90'

如果 XPath 表达式计算结果不是 “true”(例如,客户成为客户的时间不足 5 年,或者客户的信用评级低于 90),那么该流会使用一个 Stop 原语停止,而不执行任何进一步的操作。如果 PlatinumCheck 原语中的 XPath 表达式的计算结果为 “true”,那么将会触发 match1 终端,该流将继续执行 ConvertToPlatinumStoreRequest XSL Transformation 原语,然后执行 GetCustomerIDFromUserContext Message Element Setter 原语。这两个原语设置了一个对铂金级服务的单向请求的消息。与 PlatinumCheck Message Filter 原语类似,GetCustomerIDFromUserContext 原语使用一个 XPath 表达式从图 17 中所示的 SMO 用户上下文和 Message Element Setter 属性对话框中检索客户 ID 值。

/context/userContext/entries[name = 'CustomerID']/value
图 17. GetCustomerIDFromUserContext Message Element Setter 属性对话框
GetCustomerIDFromUserContext Message Element Setter 属性对话框

通过检查已更新的 StockQuote 中介模块和新的 PlatinumServiceCheck 模块,可以看到一个使用 SMO用户上下文在 SCA 模块之间传递额外信息的示例。通过在一个模块中添加用户上下文条目,并在另一个模块中访问这些条目,可以在模块之间传递消息,无需更改服务接口(比如增加额外的字段)。

运行扩展的 Stock Quote 示例

要运行该示例,可下载本文的 下载 部分中的所有文件,然后按照以下指令进行操作:

  1. StockQuoteWithPlatinumCheck.zip 文件将所有模块和库导入 IBM Integration Designer 中。您最终会得到 3 个中介模块:StockQuote、PlatinumServiceCheck 和 BackendServices;以及一个名为 Resources 的库模块。
  2. 启动 WebSphere ESB 服务器。
  3. 准备 Customer 数据库(一个 Derby 数据库),将 SQCustomerDB.zip 文件解压到计算机上的某个目录中,目录路径中不应有空格。在本文中,我们使用的是 C:/temp。您最终得到一个名为 SQCustomerDB 的目录,其中包含 Derby 数据库文件。
  4. 在 WebSphere ESB 中为新数据库创建一个数据源:
    1. 转到 WebSphere ESB 管理控制台(通常位于 http://localhost:9060/ibm/console)。
    2. 登录(如果有必要)并转到 Resources > JDBC > Data sources
    3. 从范围下拉列表中为您的新数据源选择合适的范围。对于本示例,“Cell-level” 就非常适合。然后单击 New 按钮。
    4. 为新数据源提供一个数据源名称和 JNDI 名称。数据源名称为 “SQCustomer”,JNDI 名称必须为 “jdbc/sample/CustomerDatabase”。单击 Next 按钮。
    5. 选择 Create new JDBC provider。单击 Next 按钮。
    6. 对于数据库类型,可以选择 Derby。对于提供程序类型,可以选择 Derby JDBC Provider。对于实现类型,可以选择 XA data source。单击 Next 按钮。
    7. 对于数据库名称,提供解压的 SQCustomerDB 目录的文件路径,例如 C:/temp/SQCustomerDB。单击 Next 按钮。
    8. 将安全性别名保留为 “'(none)”,因为这个示例数据库中没有使用安全性。单击 Next 按钮。
    9. 检查您的数据源的摘要。单击 Finish 按钮。
    10. 单击 Save 链接,保存 WebSphere ESB 配置更改。
    11. 测试与 Customer 数据库的连接,方法是单击数据源表中新的数据源旁边的复选框,然后单击 Test connection 按钮。如果没有看到成功消息,请检查数据源的设置,具体而言,请检查数据库名称值是否正确,是否与您在第 3 步中解压的 Derby 数据库文件一致。
  5. 在 IBM Integration Designer 中,将 3 个中介模块应用程序添加到您的服务器中,方法是转到 Servers 视图,右键单击 WebSphere ESB 服务器,然后从菜单选择 Add and Remove。在 Add and Remove 对话框中,选择 BackendServicesAppPlatinumServiceCheckAppStockQuoteApp。单击 Add 按钮将它们都添加到服务器中。单击 Finish 按钮在 WebSphere ESB 服务器上安装并启动这些应用程序。
  6. 使用 Integration Designer 中的 Integration Test Client 运行该示例:
    1. 在 Integration Designer 中,右键单击 StockQuote 项目并选择 Test > Test Modules。Integration Test Client 将会打开。
    2. 在 Detailed Properties 部分中,将 Module 设置为 StockQuote,将 Component 设置为 StockQuoteService,将 Interface 设置为 StockQuoteService,将 Operation 设置为 getQuote
    3. 在消息部分中,将代号值设置为 AAA,将 customerID 值设置为 1000。请参见图 18,了解 Integration Test Client 设置。
      图 18. Integration Test Client 设置
      Integration Test Client 设置
    4. 单击 Events 部分中的 Continue 按钮(绿色的三角形按钮)运行测试。在 Deployment Location 对话框中选择您的 WebSphere ESB 服务器,如果收到请求,则提供您的服务器登录名和密码,然后单击 Finish
    5. 当测试运行时,Integration Test Client 会使用所提供的消息来调用 StockQuote 模块中的 StockQuoteService 导出语句。PlatinumServiceCheck 模块会使用额外的用户上下文数据来调用,然后调用 RealtimeService 和 PlatinumService(参见图 19)。
      图 19. Integration Test Client 输出
      Integration Test Client 输出

您现在可以在服务器日志中看到输出 “Platinum storeRequest service called” 和消息内容。

SQCustomerDB 提供了 5 个不同客户的详细信息。当在 Integration Test Client 中提供不同的 customerID 值并重新运行测试时,可以在服务器上看到不同的结果,如表 1 所示。

表 1. 预期的测试结果
客户 ID 订阅级别成为客户的年数信用评级调用的服务是否调用铂金级服务?
1000 铂金 4 91 RealtimeService
2000 铂金 6 91 RealtimeService
3000 标准 6 91 DelayedService
4000 铂金 6 80 RealtimeService
5000 铂金 3 60 RealtimeService

结束语

本文介绍了如何在 WebSphere ESB 和 IBM Integration Designer 中使用用户上下文,使您能够在中介模块之间传递额外的信息,无需更改服务接口。


下载

描述名字大小
代码样例StockQuoteWithPlatinumCheck.zip72KB
代码样例SQCustomerDB.zip66KB

参考资料

学习

获得产品和技术

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=WebSphere
ArticleID=854426
ArticleTitle=在 IBM Integration Designer 中实现跨多个 WebSphere ESB 中介流的用户上下文
publish-date=01102013