业务逻辑与连接性逻辑:将 WebSphere Process Server 和 WebSphere ESB 一起使用

当构建面向服务的解决方案时,利用最适当的参考体系结构可以使关注内容有益分离。与侧重于使用 IBM® WebSphere® Process Server 或 IBM WebSphere ESB 不同,下面的示例演示了有时有必要同时使用二者。 本文来自于 IBM WebSphere Developer Technical Journal

Koichi Nakamura (JL25377@jp.ibm.com), 高级技术人员, IBM

Koichi Nakamura 是 IBM WebSphere Software Services 组织的一名软件工程师。他在 IBM 的主要工作是从事软件开发。他主要开发了基于 Web 的实时协作产品,如 Web Collaboration、Lotus Sametime 和 Workplace Team Collaboration。近年来,他的工作转移到基于面向服务的体系结构的客户服务项目,并在业务方面专注于对 SOA 解决方案的技术支持。他特别对业务流程技术感兴趣。Koichi 在日本东京居住和工作,并喜欢到世界各地旅游。



Andre Tost (andretost@us.ibm.com), 高级技术人员, IBM

Andre TostAndre Tost 是 Software Group 的 Enterprise Integration Solutions 组织的一名高级技术人员,他在这个部门帮助 IBM 的客户建立面向服务的体系结构。他专长于 Web 服务技术。在从事目前的工作之前,他有十年的时间在 IBM 软件开发工作中担任各种合作伙伴支持、开发和构架设计方面的角色,目前他在 WebSphere Business Development 小组工作。他出生于德国,现在美国明尼苏达州的罗彻斯特居住和工作。在业余时间,他喜欢和家人在一起,并且有空就去踢球或看球赛。


developerWorks 大师作者

2008 年 1 月 28 日

引言

IBM developerWorks 中的文章向您介绍了如何使用 IBM WebSphere Process Server 解决大量的不同技术和业务场景。类似地,还有一些文章介绍如何将 IBM WebSphere Enterprise Service Bus (ESB) 产品应用到许多与 ESB 相关的场景。开发人员主要基于自己的背景和技能级别侧重于使用这些产品之一(而不是其他产品)。当然,当所使用的技术与实际的整体解决方案最匹配时,最终产品受益最大。为此,本文重点介绍业务问题,然后探讨所谓的业务逻辑连接性逻辑之间的差异,最后介绍如何在两种产品中实现逻辑。本文还包括可以下载并在自己的环境中实验的具体示例。


业务问题

下面是具体场景:虚拟公司(即全球航空公司)最近与两个航空公司(即太平洋航空公司和大西洋航空公司)形成联合公司。作为协商的一部分,经常在一个航空公司乘机的乘客可以用其累积里程数在其他两个公司中的任何一个公司订购机票。因此,全球航空公司需要创建新的解决方案,使乘客能够订购按里程优惠的机票。如果乘客在其他两个航空公司之一具有里程数记录,则全球航空公司的解决方案将从其他航空公司自动检索该乘客的情况。

全球航空公司体系结构团队决定根据面向服务的体系结构 (SOA) 的原理构建这一新的解决方案,利用 IBM SOA Foundation 作为基础体系结构模型,随后,在运行时环境中使用其产品。


从体系结构开始

希望根据 SOA 构建解决方案的公司通常为他们的企业建立体系结构参考模型。此类模型使他们能够显式描述某些功能区,并展示他们之间的相互关系。任何新的解决方案实质上都是使用此参考模型构建的,并且此解决方案的不同方面可以使用不同的产品和技术。

IBM 定义和发布了 SOA 基础参考体系结构,它可以用作任何公司的、基于 SOA 的参考体结构的起点。图 1 显示了此体系结构的逻辑模型视图。

图 1. IBM SOA 基础参考体系结构逻辑模型
图 1. IBM SOA 基础参考体系结构逻辑模型

此图介绍了不同类型的服务如何通过企业服务总线 (Enterprise Service Bus) 相互交互。全球公司团队现在面临的任务是正确构建新的预订解决方案。团队确定了某些所需逻辑可以实现实际的预订业务流程,其他逻辑可以处理与另一个航空公司提供的服务和连接的交互。


业务逻辑与连接性逻辑

新的预订解决方案所需的两个不同类型的逻辑可以映射到与图 1 所示类似的参考体系结构。解决方案中与流程相关的部分在“流程服务”中处理,ESB 将处理与其他航空公司服务的连接性,其中包括可能需要的任何数据转换。

此分离关注使具有两种不同技术的开发人员能够使用该解决方案并行工作:

  • 业务逻辑由熟悉预订和成功订购机票必要步骤的人员开发。
  • 连接性逻辑由了解协议和联合公司中其他航空公司支持的数据格式的人员创建。

使两种逻辑能够进行通信的是虚拟服务接口。我们将调用此虚拟接口,因为没有为它提供真正的服务提供程序。该接口由 ESB 提供,ESB 可以适当地路由和操作请求和响应消息。了解此虚拟服务接口后,可以独立开发和维护两种逻辑。本文稍后将详细介绍这方面内容。(考虑到本文的目的,假设每个航空公司返回频繁飞行乘客的里程数的服务接口已经存在,并得到了很好理解。)图 2 显示了此解决方案的图形表示形式。

图 2. 优惠飞行预订解决方案
图 2. 优惠飞行预订解决方案

此图显示了业务流程和中介流松散地耦合在一起,它们之间只有一个依赖项,即上面提到的虚拟服务接口。可以非常容易地将加入联合公司的新航空公司添加到解决方案,而无需对业务流程进行任何更改。


构建解决方案

在本文的其余部分,假设开发新预订系统的全球航空公司团队选择 WebSphere Process Server(以下称为 Process Server)承载业务流程,并为中介流选择 WebSphere ESB。适用于两个运行时环境的工具是 WebSphere Integration Developer(以下称为 Integration Developer)。尽管此选择可能需要更详细的讨论,但是毫无疑问,Process Server 是 IBM 用于开发和执行业务流程的首选解决方案,并且 WebSphere ESB 支持简化示例提出的要求。此外,WebSphere Process Server 包括 WebSphere ESB 运行时,并且二者共享同一 Integration Developer 工具。

这里的详细说明不用于演示如何构建解决方案。而是描述解决方案的最主要部分,并解释其构建方式的原因。本文包括 Integration Developer 项目交换文件和完整的示例。您可以下载此文件,并将其导入到自己的工作区。此示例项目仅用于演示目的;为简单起见,忽略了实际应用中必需的多个元素。

本文假设您了解 WebSphere Integration Developer 的基础知识。在参考资料部分中,可以找到使用 Integration Developer 创建解决方案的其他基本内容的链接。

共享库

为定义在业务逻辑和连接性逻辑中使用的资源,示例中提供了名为 GlobalAirlinesLibrary 的库模块。在此库模块中,定义了以下资源:

  • 预订业务对象:包括关于机票预定的所有信息。
  • PassengerDetails 业务对象:包括预订机票的乘客的详细信息。
  • FrequentFlyerInfo 业务对象:包括乘客的频繁飞行信息。
  • RetrieveMilesStatus 接口:检索适当航班的飞行里程的接口;使用乘客的详细信息调用该请求,并且以整数格式返回乘客里程数(图 3)。
图 3. RetrieveMilesStatus 接口
图 3. RetrieveMilesStatus 接口

此库中定义的所有资源共享同一命名空间。对于下面描述的构件,也是这种情况;每个模块对其包含的资源使用自己的命名空间。这反映它们属于整个系统的不同部分,并且还可以避免在基础生成代码中发生任何冲突,例如,确保每个模块以不同方式命名的 Java™ 包结束。

上面描述的接口和相关业务对象表示业务流程和中介之间的唯一连接点。因而,需要首先定义它。

业务逻辑 (WebSphere Process Server)

Airline Award Reservation 解决方案的业务逻辑在 GlobalAirlinesBP 模块中定义。在本例中,应先创建业务组件,并确定此组件将具有的所有外部依赖关系。这些依赖关系表示为合作伙伴链接,稍后将作为创建服务组件体系结构(Service Component Architecture,SCA)组装的一部分进行分析。

ReservationProcess 业务流程组件

它是 GlobalAirlinesBP 模块中的主要组件。在此业务流程中,将定义预订操作流程,它具有一个名为 ReserveAwardFlight 的接口。使用 Integration Developer 工具中的流程编辑器将该流程内置在 BPEL 中,如图 4 所示。

图 4. 业务流程
图 4. 业务流程

当请求预订时,会生成新的流程实例,并在 Receive 活动中接收输入预订数据。在 SetPassengerDetails 活动中,将数据从传入请求消息复制到本地变量集,以便稍后在流程中使用。RetrieveMiles 活动用来获取乘客可以在此预订中使用的里程数。然后,调用另一个活动,这次将完成和确认预订。最后,将确认返回到 Reply 活动中流程的调用方。

从流程调用的两个外部活动(RetrieveMiles 和 ReserveWithMiles)由合作伙伴链接表示,在图 4 中的 Reference Partners 部分可以看到它们。

这就引出了本文中的另一个重点。我们假设联合航空公司的成员有多个服务端点(稍后将定义其中两个),必须选择一个适当的端点来检索乘客进行预订所需的里程数。另外,每个航空公司的服务端点可以有自己的接口(请记住,假设设计此解决方案之前存在这些情况)。如果业务流程包括选择正确的服务端点并转换为适当数据或接口的逻辑,我们将混合业务逻辑和连接性逻辑,使随着时间的推移难以开发和维护逻辑。

相反,按照分离关注的好的做法,我们将选择和转换委派给 ESB,业务流程只在执行连接性逻辑的 ESB 上调用虚拟服务接口。

GlobalAirlinesBP SCA 组装

通过将 ReservationProcess 流程组件的引用连接到其他组件可以解决该组件的外部依赖关系。上面定义的流程有两个此类引用,这样在组装中将创建两个附加组件:

  • RetrieveMilesImport 是用于连接到外部连接性逻辑以从适当航空公司检索乘客里程数的 SCA 导入。它支持 RetrieveMilesStatus 接口。本示例中使用 SCA 绑定来绑定业务流程和连接性逻辑。选择此绑定的原因是将两个模块部署到同一服务器实例,并且对于这种情况,此绑定是最有效的。

  • ReserveWithMiles 是一个 Java 组件,用于接收预订信息和检索里程数并使用 true 或 false 返回确认信息。在实际环境中,它是另一个外部组件。不过在本示例中,为了简单起见,我们使用内部 Java 组件。

图 5 中显示了组件及其关系。

图 5. GlobalAirlinesBP 组装
图 5. GlobalAirlinesBP 组装

注意,我们没有向此连接添加导出组件,因为我们稍后将使用 BPC Explorer(不需要任何导出)测试组件。

连接性逻辑 (WebSphere ESB)

正如前面提到的,连接性逻辑负责基于内容的服务端点选择,并负责调用所选端点的数据或接口映射。此逻辑将在 GlobalAirlinesESB 模块中创建。与 GlobalAirlinesBP 模块不同,这里您可以先从完成组装图开始,因为此时已了解所有外部依赖关系。稍后将创建中介流组件中包含的实际连接性逻辑。

GlobalAirlinesESB 组装

GlobalAirlinesESB 模块由中介组件、导出和两个导入组成。图 6 显示了这些组件及其关系。

图 6. GlobalAirlinesESB 组装
图 6. GlobalAirlinesESB 组装
  • RetrieveMilesMediation 是一个中介组件,用于选择适当的服务端点并映射到调用它的所选端点接口。该组件包含上面定义的 RetrieveMilesStatus 接口。下一部分将描述关于该组件的详细信息。

  • RetrieveMilesExport 是一种 SCA 导出,上面创建的业务流程可以使用该导出访问 RetrieveMilesMediation 组件。通过此导出从业务流程调用中介组件。因此,业务流程模块的导入中使用的绑定类型必须与中介模块的导出中使用的绑定类型匹配。为使这两个模块能够有效地通信,这里选择了 SCA 绑定(在其他绑定中,当两个模块运行在同一流程中时,SCA 绑定不需要网络跃点)。

  • AtlanticAirlinePacificAirline 是用来连接航空公司提供的外部 Web 服务的 SCA 导入。每个服务都具有检索乘客里程的方法,但是接口略有不同。GetMilesFromAtlanticAirline 接口采用完整的 PassengerDetails 业务对象作为导入参数并以整数值格式返回里程数,而 GetMilesFromPacificAirline 接口需要乘客名作为字符串,而且还以字符串格式返回里程数。在操作时它们也使用不同的名称。

每个服务都使用与 SOAP/HTTP 绑定的 Web 服务作为传输协议。(如果您在自己的环境中测试下载的示例,则可能必须修改端点 URL 中的主机名和端口号,以便这两个导入适合您的环境。)

RetrieveMilesMediation 中介流组件

它是 GlobalAirlinesESB 模块中的主要组件。在此中介中,根据乘客频繁飞行信息选择适当的航空服务。另外,还执行数据映射来转换请求和响应参数,以匹配所选航空服务的接口。图 7 显示了 RetrieveMilesStatus 接口的请求部分。

图 7. RetrieveMilesMediation 中介流组件
图 7. RetrieveMilesMediation 中介流组件

在 MessageFilter1 元素中,检查乘客频繁飞行信息中存储的航空公司代码,以选择用于该请求的合适航空服务。如果“AA”是特定的航空公司代码,则选择 AtlanticAirline,并将请求消息转发到 XSLTransformation1。对于所有其他航空公司代码,则选择 PacificAirline,并将消息转发到 XSLTransformation2。图 8 显示了 MessageFilter1 元素的属性。

图 8. MessageFilter1 元素属性
图 8. MessageFilter1 元素属性

在每个 XSLTransformation 中都转换了参数,使之与目标服务接口匹配。图 9 显示了请求消息到 AtlanticAirline 服务的转换。

图 9. AtlanticAirline 服务端点的转换
图 9. AtlanticAirline 服务端点的转换

注意,请求消息和响应消息都必须转换成正确的格式。我们的示例中使用的其他转换非常类似于上面所示的转换,因此不再介绍。(请参考导入自己环境中的下载示例,以浏览所有转换。)


测试解决方案:预订第一张机票

现在是测试 Airline Award Reservation 解决方案的时候了。启动测试服务器 (WebSphere Process Server V6.0) 后,将示例中包括的以下项目部署到该服务器:

  • GlobalAirlineBPApp
  • GlobalAirlineESBApp
  • AtlanticAirlineServiceEAR
  • PacificAirlineServiceEAR

(在实际处理环境中,流程逻辑 (GlobalAirlineBPApp)、ESB 逻辑 (GlobalAirlineESBApp) 和每个服务项目很可能正在独立服务器上运行。)

测试服务器启动后,请使用测试服务器的上下文菜单的 Launch 菜单启动 Business Process Choreographer Explorer(BPC Explorer)实用工具。在 BPC Explorer 中,选中 My Process Templates 面板中的 ReservationProcess,单击 Start Instance 按钮,以启动业务流程。图 10 显示了如何向优惠预订系统输入信息。

图 10. BPC Explorer
图 10. BPC Explorer

向预订系统输入信息后,单击 Submit。这将执行业务流程实例、调用中介流和调用适当的航空服务以检索乘客的里程数。如果确认预订,则将值“true”返回到 BPC Explorer,如图 11 所示。

图 11. BPC Explorer 显示了流程调用的结果
图 11. BPC Explorer 显示了流程调用的结果

现在检查工具中的控制台视图。根据在输入面板中输入的数据,显示的消息应与以下所示类似:

[9/23/07 17:34:00:094 CDT] 00000083 SystemOut  O [AtlanticAirlineService] retrieveMiles()
[9/23/07 17:34:00:328 CDT] 00000084 SystemOut  O [ReserveWithMilesImpl] reserveWithMiles()

如果使用航空公司代码“AA”调用预订,则在连接性逻辑中选择并调用 AtlanticAirline 服务,并且消息:

[AtlanticAirlineService] retrieveMiles()

进入视图中。如果使用其他航空公司代码调用预订,则选择 PacificAirline 服务,并且消息:

[PacificAirlineService] getMiles()

进入视图。


结束语

本文阐述了在构建面向服务的解决方案时,如何利用参考体系结构得到理想的分离关注。我们将优惠飞行预订解决方案的示例划分为业务逻辑(在 WebSphere Process Server 中开发和部署)和连接性逻辑(在 WebSphere ESB 中开发和部署)。可以彼此独立地开发解决方案的两个部分,对其中一个部分的更改不会影响另一个部分。开发这些不同部分所需的技能也是不同的,一个侧重于业务方面,一个侧重于连接性方面。


下载

描述名字大小
Sample codeglobalairlinesPI_new_09182007.zip104 KB

参考资料

条评论

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, SOA and web services
ArticleID=283317
ArticleTitle=业务逻辑与连接性逻辑:将 WebSphere Process Server 和 WebSphere ESB 一起使用
publish-date=01282008