在本系列的第 1 部分,我们引入了服务组件体系结构作为编程模型来构建和组装集成解决方案,简要介绍了什么是 SCA,以及一些相关术语的定义。在第 2 部分,我们讨论了引用和限定符,并说明了如何将各种组件连接到一起以创建 SCA 模块。在第 3 部分,我们将深入了解构建 SCA 模块的主要好处之一,即能以各种组件为基础垂直构建集成解决方案。
随着系统不断发展而变得更为复杂,有必要将各种解决方案进行水平集成;组织中的不同部门可能需要构建自己的解决方案并稍后将其集成到一起,或者可能不同的业务合作伙伴将需要通过 Internet 集成其解决方案。图 1 显示了一个此类水平集成的示例:
图 1. 集成系统
我们在第 1 部分中定义了 SCA 导入和导出,但我们将在本文中对其进行更为深入的研究,并继续构建我们的精简示例。具体来说,将重点讨论使用 SCA 绑定的 SCA 导入和导出。SCA 绑定允许一个模块中的 SCA 组件使用 SCA 编程模型与另一个模块中的 SCA 组件通信。
在本文中,我们还将升级到 IBM WebSphere Integration Developer V6.0.1,该版本允许构建特定的集成解决方案,以将 IBM WebSphere Process Server V6.0.1 或 IBM WebSphere Enterprise Service Bus V6.0.1 解决方案结合使用。在这个新版本中,我们还添加了对构建各种企业服务总线(Enterprise Service Bus,ESB)中介的支持。(WebSphere ESB 运行时是 WebSphere Process Server 的子集;有关更多信息,请参阅参考资料。)
导入与导出回顾
正如在第 1 部分中提到的,用于进行模块到模块和模块到外部服务调用的机制分别称为导入和导出。导入和导出是从模块角度而言,而模块是一个执行特定业务功能的自包含组件包:
图 2 显示了一个使用导入和导出的 SCA 组装。该图表明,导出是外部的入口点,而导入则允许您调用模块外的功能。
图 2. SCA 导入和导出
当通过导入和导入调用 SCA 组件时,参数将按值传递,即参数将从一个结构中复制到另一个结构。图 3 显示了两个彼此进行通信的 SCA 模块,并说明了 SCA 导入如何与 SCA 导出匹配。
图 3. SCA 导入和导出
将 SCA 组件粘附到一起的连接机制抽象出了大部分基础结构级的代码。例如,可以将连接机制定义为同步或异步的,操作可以为单向的或为请求-响应型,或者可以定义组件间的事务处理行为。SCA 将为您处理基础结构细节。
导入和导出可以与其他技术绑定,如 JMS、Enterprise JavaBeans (EJB) 或 Web 服务,如图 4 所示。通过绑定到这些技术,可以通过使用 SCA 编程模型来让 Web 服务客户机调用 SCA 模块,或者让 SCA 模块调用现有 EJB 模块(由于 EJB 导入是由 Java™ 接口定义的,所以使用 EJB 导入有一些限制;因此,BPEL 之类——要求合作伙伴支持 WSDL——无法调用 EJB 导入。详见后文)。
图 4. 与其他技术的导入与导出
导入/导出绑定
面向服务的体系结构的一个关键在于能够公开采用大量绑定选项的服务,以及能够使用行业规范调用服务。正如所指出的,WebSphere Process Server 和 WebSphere ESB 提供了一系列不同的绑定类型来帮助满足此类需求。绑定类型使用 Assembly Editor 与导出和导入关联。目前有五种主要的绑定类型:
-
SCA——用于模块间的 SCA 调用的绑定类型。该绑定类型是配置最简单的类型,可提供模块间的无缝集成。
-
Web 服务——可提供调用外部 Web 服务和将模块内的功能作为 Web 服务公开的功能。缺省情况下,Web 服务将使用 doc-lit 包装样式,可以与 HTTP 和 JMS 协议一起使用。Web 服务绑定功能是从基础 WebSphere Application Server 基本 Web 服务引擎派生的,受到相同的限制。
-
企业信息系统(Enterprise Information Systems,EIS)——提供通过 WebSphere JCA Adapter 集成到现有 EIS 系统的功能。此绑定类型的可用配置将根据目标不同而有所改变(SAP、JDBC Adapter 等等)。企业数据发现服务通常与每个适配器一起提供,以帮助创建业务对象和导入与导出绑定。
-
Java Messaging Service——提供与使用 JMS 作为消息传递协议的端点进行集成的功能。在这种情况下,导入和导出使用数据绑定来帮助解析正确的业务对象/操作组合。
-
无状态会话 Bean——提供使用 Java 接口与无状态会话 Bean 集成的功能。此功能只有在将 Java 引用连接到 Java 接口时才可用。在 WebSphere Integration Developer 中,使用 WSDL 引用的组件不允许连接到无状态会话 Bean 提供的 Java 接口。在此情况下,要求使用具有 WSDL 接口和 Java 引用的中间组件。
在本文中,我们将更深入地讨论 SCA 绑定的情况。本系列的后续文章将对其他导入/导出绑定进行更为深入的分析。
SCA 绑定
SCA 绑定提供了一致的方法来在 WebSphere Process Server 或 WebSphere ESB 环境中跨模块边界进行通信。将基于客户机模块使用的调用模式自动选择 SCA 绑定所使用的基础协议。
SCA 提供四种调用模式。
-
同步——客户机发出请求,并等待响应。
-
异步单向——客户机发出请求,不等待响应。
-
异步延迟响应——客户机发出请求,客户机将在稍后请求响应。
-
异步回调——客户机发出请求,目标将调用使用响应调用客户机实现的服务。
WebSphere Process Server 或 WebSphere ESB SCA 运行时将确定何时使用基础系统集成总线(对于异步调用模式)或 RMI/IIOP(对于同步调用模式)。
SCA 绑定是由导出驱动的。在 SCA 模块安装到 WebSphere Process Server 的过程中,将创建必要的支持构件:
- 对于异步调用,将在 SCA.SYSTEM.<cell name>.Bus 中创建计算单元范围内的服务集成总线(Service Integration Bus,SIBus)目的地。
- 对于同步通信,将创建一个指向模块会话 Bean 的计算单元范围内的名称空间绑定;模块会话 Bean 是无状态会话 Bean,供模块用于各种目的,如作为工作边界、安全配置等的单元。
导入和导出文件一起工作,其中导入文件包含关于导出的重要信息,可帮助任意数量的客户机导入目标服务。
SCA 运行时通过使用 .import 文件中的信息和调用模式(sync 或 async),可确定是使用 SIBus 目的地还是 WebSphere 名称空间绑定。
将创建一系列 SIBus(请参阅参考资料)目的地来支持 WebSphere Process Server 和 WebSphere ESB 提供的各种异步调用类型;将为模块、组件、导入和导出创建目的地。每个目的地和转发路由路径将确保将消息路由到正确的目标服务。图 5 显示了 SIBus 目的地的一个示例。
图 5. SIBus 目的地
此外,将为模块中的每个 SCA 导出创建一个名称空间绑定,如图 6 中所示。此绑定将在计算单元范围内创建,并遵循以下命名模式:
sca_ + <Module Name> + _export_ + <ExportName>。
图 6. 名称空间绑定
在给定这两组构件范围的情况下,SCA 导出绑定在整个计算单元内都可见。客户端模块和目标模块可以放置在计算单元内的任何 WebSphere Process Server 或 WebSphere ESB 服务器上,且仍然能够进行通信。
导出限定符
使用 SCA 绑定的导入是 SCA 组件在另一个模块中的逻辑表示。因此,可以采用与图 7 所示相同的方法在指向导出的引用上定义限定符。
图 7. 添加限定符
导出并不包含任何限定符;相反,将要在导出的组件上放置限定符,详见第 2 部分中的说明。
库项目
跨越模块边界,必须考虑共享协定这一事实。应用程序通过接口进行通信,彼此传递数据对象。这意味着接口和业务对象应对模块可见,或位于与模块相同的位置。为了减少在每个模板中重复定义相同的接口和数据对象,WebSphere Integration Developer 包括了一个特殊的 SCA 库模块,可以将其添加到 SCA 模块,就像 Java JAR 文件可以为 EAR 文件中独立的 JAR 一样。(事实上,WebSphere Integration Developer 就是这样处理库的。)这就允许您在单个位置中定义接口和业务对象,然后让所有模块对其进行共享。稍后我们将给出一个 SCA 库示例。
我们的示例应用程序
我们将继续使用在整个系列中使用的 Credit Approval 应用程序。在本文中,我们将演示如何通过将 Credit History 和 Credit Agency 模块外部化来使各个模块分离,以了解如何配置导出和导入。为了进行说明,我们还将演示如何在模块间共享 SCA 库。
为了运行此示例,您将需要正确安装 WebSphere Integration Developer V6.0.1(该版本支持 WebSphere ESB)并在您的计算机上运行(请参阅参考资料),还要获取本文所附的下载材料,其中包含两个 SCA 模块(Credit Agency 和 Credit History 模块)和一个具有共享接口及业务对象的 SCA 库。
-
设置工作区。
-
启动 WebSphere Integration Developer。打开新工作区并关闭欢迎屏幕。
-
您将需要导入所下载的 Project Interchange。为了导入 Project Interchange,在 Business Integration 视图内单击右键,然后选择 Import,如图 8 所示。
图 8. Eclipse 导入向导
-
选择 Project Interchange,然后选择 Next (图 9)。
图 9. 导入 Project Interchange
-
选择下载文件 <Download_root>/SCAArticlePart3.zip,然后单击 Select All,并单击 Finish (图 10)。
图 10. Select All
-
检查我们刚刚导入的构件:
-
从 Business Integration 透视图中展开 CreditApprovalLibrary。正如前面提到的,SCA 库可以用于方便地保存模块间共享的业务对象和接口。图 11 显示了 Business Integration 视图中的 CreditApprovalLibrary。
图 11. CreditApprovalLibrary
通过在 Business Integration 透视图内上下文有关的菜单中选择 New => Library,可以方便地创建 Library 项目。在此例中,我们已经提供了接口和数据对象。
-
展开 CreditAgencySCAModule 和 CreditHistory 模块。
-
为每个模块打开 Assembly Editor。在前面的第 2 部分中的示例中,我们在单个模块中包含了多个组件。在此示例中,我们将对实现进行分离,以模拟多个独立的解决方案。通常,SCA 具有包含多个组件的完整解决方案。对于本文,我们假定这些为不同开发组(不同的管理人员、日程安排和项目规划)开发的完整解决方案。图 12 显示了 Business Integration 视图中的 SCA 模块。
图 12. SCA 模块
-
这两个 SCA 模块都依赖于 SCA 库模块;这个依赖关系可以在 Dependency Editor 看到。分别右键单击每个 SCA 模块,并选择 Open Dependency Editor(图 13)。
图 13. 打开 Dependency Editor
-
检查每个模块对应的 Dependency Editor,以确保在两个模块间共享了 CreditApprovalLibrary,如果是这样,CreditApprovalLibrary 将显示为图 14 所示的情况。
图 14. CreditApprovalLibrary
- 关闭编辑器。
|
|
创建 SCA 导出
接下来,我们将为每个模块创建 SCA 导出,以便可以从其他 SCA 模块调用此模块。
-
为 CreditAgencySCAModule 创建导出:
-
在 WebSphere Integration Developer 中,打开 CreditAgencySCAModule Assembly Editor。在 Business Integration 视图中展开 CreditAgencySCAModule,并双击 CreditAgencySCAModule Assembly Editor 图标,如下面的图 15 中所示。
图 15. 打开 Assembly Editor
-
要创建导出,请右键单击 CreditApproval 组件,并选择 Export =>SCA Binding(图 16)。
图 16. 创建具有 SCA 绑定的 SCA 导出
-
将自动为 CreditAgency 组件创建具有 SCA 绑定的导出,如图 17 中所示。
图 17. SCA 导出
-
在 Assembly Editor 中选中此导出的同时查看 Properties 视图,以检查导出的各个属性。您将会在 Details 选项卡中看到操作的 SCA 详细信息,如图 18 中所示。
图 18. SCA 导出详细信息
-
切换到 Qualifiers 选项卡(图 19)。您会发现无法添加任何限定符。这是因为导出将使用其所指向的组件的限定符。
图 19. 导出没有限定符
-
保存并关闭 Assembly Editor。
-
采用类似的方法为 CreditHistorySCAModule 创建导出:
-
和前面一样,为 CreditHistorySCAModule 打开 Assembly Editor。
-
和前面一样,生成具有 SCA 绑定的导出(图 20)。
图 20. SCA 导出
-
保存并关闭编辑器。
创建 Credit Approval 模块
现在我们将创建要通过导入调用其他两个模块的 CreditApprovalModule。
-
首先,创建一个新的 SCA 模块:
-
在 Business Integration 视图中单击右键,然后选择 New => Module。
-
将该模块命名为 CreditApprovalSCAModule
(图 21)。确保选中 Use Default,然后单击 Finish。
图 21. 新建 SCA 模块
-
右键单击新创建的 CreditApprovalSCAModule,并选择 Open Dependency Editor(图 22)。
图 22. 打开 Dependency Editor
-
由于 CreditApproval 模块将调用其他两个模块,因此需要共享在其间传递的接口和业务对象。请记住,我们要使用库来存储这些接口和业务对象。在 Dependency Editor 中的 Libraries 节中选择 Add,如图 23 所示。
图 23. 向 SCA 模块添加库
-
选择 CreditApprovalLibrary,然后单击 OK。
-
现在将创建一个调用组件。出于演示目的,我们将使用基于 Java 的简单组件;在以后的文章中,我们将展示调用各种组件和模块的 BPEL 流。
-
双击 CreditApprovalSCAModule Assembly 图标,以打开 CreditApprovalSCAModule Assembly Editor(图 24)。
图 24. 打开 SCA Assembly Editor
-
将 SCA 组件 (图 25)拖放到 Assembly Editor 上。
图 25. 将 SCA 组件拖放到 Assembly Editor 上
-
单击文本,并键入名称,从而将组件重命名为 CreditApproval,如图 26 中所示。
图 26. 更改组件名称
-
接下来,我们将向该组件添加接口。我们将接口存储在库项目中。
-
在组件上单击 Interface 图标(图 27 的圆圈内),然后从菜单中选择 CreditRequest。
图 27. 向 SCA 组件添加接口
-
单击 OK。
我们刚刚创建了一个 SCA 组件。该组件将通过导入调用其他两个模块。
创建导入
我们已经完成了导出的创建,现在就可以开始创建 SCA 导入了。我们需要为要调用的每个导出创建一个 SCA 导入。在我们的示例中,我们将进行以下工作:
- 调用 CreditAgency 和 CreditHistory 模块。
- 更新 CreditHistory 导入的限定符,以在异步调用组件时正确地处理事务处理行为。
- 假定 History 请求需要花一定的时间进行调用,那么我们将异步发出 History 请求。
- 在请求之后,同步调用 CreditAgency 模块。
- 获取信用分数后,以延迟方式获取 History Response。
-
首先,为 CreditAgency 调用创建导入:
-
从面板上将 import 图标拖放到 Assembly Editor 上(图 28)。
图 28. 将导入拖放到 Assembly Editor 上
-
单击文本并键入 CreditAgencyImport
,从而重命名导入,如图 29 中所示。
图 29. 重命名导入
-
接下来,我们将添加相应的接口。在此情况下,导入的接口必须与 CreditAgencySCAModule 中对应的导出的导入匹配。
单击 Import 上方的 Interface 图标(图 30 的圆圈内),然后选择 CreditAgency 接口。
图 30. 向 SCA 导入添加导入
-
添加相应的绑定,在此例中,添加 SCA 绑定:
-
右键单击导入,并选择 Generate Binding => SCA Binding(图 31)。
图 31. 向导入添加 SCA 绑定
-
在 Assembly Editor 中突出显示导入,转到 Properties 视图,并选择 Binding 部分(图 32)。单击 Browse。
图 32. 浏览导出
-
选择 CreditAgencyExport(图 33)。
图 33. 选择导出
-
接下来,我们需要将 CreditApproval 组件连接到 CreditAgencyImport。
-
在 Assembly Editor 中选择 CreditApproval 组件,并将一个 wire 拖放到 CreditAgencyImport。
图 34. 将 SCA 组件连接到 SCA 导入
-
在对话框中单击 OK,以在 CreditApproval 组件上创建引用(图 35)。(在第 2 部分中对引用进行了讨论。)
图 35. 确认引用创建
-
保存编辑器,并使其保持为打开状态。下面的图显示了已连接的组件的最终结果。
图 36. 已连接的 SCA 模块
-
接下来,我们将为 CreditHistoryModule 创建导入。
-
和前面一样,将另一个 import 拖放到 Assembly Editor 并将其命名为 CreditHistoryImport
。
-
向导入添加 CreditHistory 接口,如图 37 中所示。
图 37. 添加 Credit History 接口
-
生成 SCA 绑定,并将 CreditApproval 连接到 CreditHistoryImport。图 38 显示了最终的结果。
图 38. 最终结果
请记住,我们假定 Credit History 组件的处理时间会稍微长一些,因此首先将触发异步请求以获取 History,并在稍后检索响应。在 CreditHistory 运行的同时,我们将从 CreditAgency 模块获取 Credit Score。然后我们将从 CreditHistory 捕获响应。我们可以为“服务”使用正确的 SCA API 来对 Credit History 模块进行异步调用。在这种情况下,我们希望使用前面描述的延迟响应调用模式。
生成实现
-
我们现在将为 CreditApproval 组件创建一个实现。在我们的示例中,将使用一个简单的 Java 组件。
-
在 Assembly Editor 中,右键单击 CreditApproval 组件,并选择 Generate Implementation => Java。
图 39. 生成 Java 实现
-
暂时将该类放在缺省包中(图 40)。
图 40. 缺省包
-
如果希望在稍后添加本地 Java 客户机,请在 Implement As... 对话框中选择 Yes,以创建一个匹配的 Java 接口(图 41)。
图 41. 为本地 Java 客户机创建 Java 接口
-
现在我们将编写实现的代码。
-
应在 Java 编辑器中打开实现类。正如您在 Java 编辑器中看到的,WebSphere Integration Developer 添加了方便的 Helper,以通过检查模块组装来获取合作伙伴。如果我们首先生成 Java 类,则这些方法将不存在。
public CreditAgency locateService_CreditAgencyPartner() {
return (CreditAgency) ServiceManager.INSTANCE
.locateService("CreditAgencyPartner");
}
public CreditHistory locateService_CreditHistoryPartner() {
return (CreditHistory) ServiceManager.INSTANCE
.locateService("CreditHistoryPartner");
}
|
-
将下面的代码(在 <download_root>/SCAArticleSeries3/codeSnippet1.txt 中)粘贴到 calulateCreditScore 方法内。异步调用模式以粗体突出显示。
ServiceManager serviceManager = new ServiceManager();
// create credit rating return data object using the BO factory
BOFactory bof =
(BOFactory)serviceManager.locateService("com/ibm/websphere/bo/BOFactory"
);
DataObject creditRating = bof.create("http://CreditApproval",
"CreditRating");
creditRating.setString("customerId",
creditApp.getString("customerId"));
// create and call credit history service using async deferred response invocation
// pattern.
CreditHistoryAsync cha = (CreditHistoryAsync)
serviceManager.locateService("CreditHistoryPartner");
Ticket tix = cha.getCreditLimitAsync(creditApp);
CreditAgency creditAgency = (CreditAgency) locateService_CreditAgencyPartner();
Integer creditScore = creditAgency.getCreditScore(creditApp);
Double creditLimit = cha.getCreditLimitResponse(tix, Service.WAIT);
creditRating.setInt("creditScore", creditScore.intValue());
creditRating.setDouble("creditLimit", creditLimit.doubleValue());
return creditRating;
|
-
因为缺少导入,因此在 Eclipse Editor 中应报告一些编译错误(假定启动了自动生成功能)。在 Java 编辑器中任意位置单击右键,并选择 Source => Organize Imports,如图 42 中所示。
图 42. Organize imports
-
将 BOFactory 接口解析到 com.ibm.websphere.bo,如图 43 中所示。
图 43. 解析 BOFactory
-
将 Service 接口解析到 com.ibm.websphere.sca,如图 44 中所示。
图 44. 将服务导入解析到 com.ibm.websphere.sca
-
保存 Assembly Editor。
|
|
测试解决方案
现在可以测试我们的解决方案了。集成模块时,每个模块首先应进行相应的单元测试。在本文中,我们将假定各个开发团队(CreditHistory 和 CreditAgency)都已对其组件进行了相应的测试。
-
将所有三个模块都添加到 WebSphere Process Server:
-
在 WebSphere Integration Developer 中,转到 Servers 视图,右键单击 WebSphere Process Server,并选择 Add/Romove Project(图 45)。
图 45. 向 WebSphere Process Server 添加或删除项目
-
选择 Add All,以将全部 SCA 模块添加到服务器(图 46)。
图 46. 添加所有模块
-
单击 Finish。
-
通过 WebSphere Integration Developer 组件测试工具启动服务器。
- 从 CreditApproval 模块的 Assembly Editor 中,右键单击 CreditApproval 组件,并选择 Test Component,如图 47 所示。
图 47. 启动 Test Component 功能
-
转到 Configurations 选项卡并删除两个模拟器,如图 48 中所示。如果合作伙伴不可用,可以使用模拟器来进行模拟,由于我们有实际的组件,因此不需要模拟器。
图 48. 删除模拟器
-
回到 Events 页,在 Initial 响应参数中输入一些输入数据,如图 49 中所示,然后单击 Continue。
图 49. 运行组件测试
-
在 Deployment Location 对话框中,选择 WebSphere Process Server v6.0。(图 50)
图 50. 选择 WebSphere Process Server 运行时
-
现在我们将对调用路径和结果进行检查。
-
回到 Events 选项卡。从调用路径中选择最后一个 Return,以创建结果,如图 51 中所示。
图 51. 选择 Return
-
应该看到与图 52 类似的结果。
图 52. 结果
-
如果分析调用顺序,将会发现采用了异步调用:我们没有采用“请求-响应-请求-响应”的模式,而是使用了“异步请求-请求-响应-异步响应”模式。(图 53)
图 53. 异步调用路径
-
不保存,直接关闭测试编辑器并停止服务器。
结束语
通过导入和导出,我们可以将解决方案以面向服务的方式对外公开。在本文中,您了解了如何使用 SCA 导入和导出集成 SCA 解决方案。第 4 部分,我们将讨论如何使用其他某些绑定(如 Web 服务和 JMS)与其他解决方案进行集成。