使用服务组件体系结构构建 SOA 解决方案——第 2 部分

来源:百度文库 编辑:神马文学网 时间:2024/04/30 22:19:48
组装 SCA 组件

级别: 中级
Roland Barcia (barcia@us.ibm.com), 认证 IT 专家, IBM
Jeff Brent (jeffb@us.ibm.com), 顾问软件工程师, IBM
2006 年 1 月 01 日
检验 IBM WebSphere Integration Developer 组装的SCA 组件的上下文中的引用和连线。
摘自IBM WebSphere 开发者技术期刊。
在这一系列文章的第 1 部分,我们引入了服务组件体系结构(Service Component Architecture,SCA)作为编程模型来构建和组装集成解决方案,包括简要介绍什么是 SCA,以及一些相关术语的定义。我们还提供了一个通过 IBM WebSphere Integration Developer 使用 Java? 构建 SCA 组件的示例,测试了该 SCA 组件,并使用 SCA 客户端编程模型构建了一个调用该 SCA 组件的示例 JSP 文件。在第 2 部分中,我们将继续描述引用和连线,并介绍如何使用它们来组装 SCA 组件。




回页首
在第 1 部分介绍的示例中,我们使用了一个简单的 JSP 客户端来调用 SCA 组件。该示例只用于演示;当构建您自己的实际自定义应用程序时,您可能会使用标准 J2EE? 组件模型来实现应用程序逻辑。J2EE Web 应用程序将继续调用 Enterprise JavaBean 来访问特定于应用程序的功能。实际上,SCA 编程模型是用于业务集成、应用程序组合和解决方案组装的,而不是用于 J2EE 应用程序开发的。SCA 客户端(它可以是 J2EE)通常在进程管理器外,例如它可以使用 BPEL 流程来编排工作流。与 BPEL 流程联合部署的 Web 应用程序也可以使用 SCA 编程模型来调用特定于应用程序的功能。图 1 显示了 SCA 生态系统的一个示例。

SCA 位于集成层。SCA 组件可以通过导入来调用 SCA 运行时外的应用程序。非 SCA 客户端可以通过导出调用 SCA 组件。在集成层内,可以通过定义引用和使用连线来组合 SCA 组件,这将在本文中重点介绍。有了连线和引用,您就可以在开发时定义运行时调用的特性;例如,使调用同步或异步,标记调用的转换边界,等等。这些特性是在部署时读取的,它们可以启用所需的运行时行为。图 2 阐释了这些高级概念。

再次说明,我们关注的是集成层,而不是应用层。另外,我们介绍的是较高级的集成,例如工作流编排或与 EIS 系统的高级集成。然而,出于演示目的,我们使用简单的 Java 示例来显示如何将组件连接到集成层中,强调的是连线和引用的功能而不是组件本身的实现。(在后续文章中,我们将介绍如何将 SCA 组件实现为 BPEL 流程和状态机,以及如何应用连线技术。)因此我们使用一个按比例缩减的模型来阐释引用和连线,如图 3 所示;然而,我们要记住图 2 中合适的 SCA 使用远景。





回页首
正如第 1 部分所讨论的,SCA 组件被打包成一个 SCA 模块。一个模块中的 SCA 组件通过对调用的 SCA 组件定义引用来彼此交互,并且将这些引用连线到相同模块中的其他 SCA 组件。图 4 阐释了这一概念。

对调用组件的引用是用 SCDL 表示的,如下所示:

引用的好处之一是能够定义调用期间的服务质量。当在 Assembly Editor 中连线组件时,可以指定服务质量 (QoS) 限定符。这些限定符定义了调用期间在 SCA 运行时管理组件的必要条件。




回页首
使用 SCA,您无需编程或更改服务实现代码就可以对组件应用 QoS 限定符(例如事务、安全性和可靠的异步调用)。在连线组件时,您可以指定限定符来为组件以及访问服务的客户端提供扩展的服务质量。在 IBM WebSphere Process Server 中,您可以在三个地方定义 SCA 限定符:
引用
接口
实现
在运行时,这些规范确定了客户端如何与目标组件进行交互。运行时环境可以提供所需的任何额外处理,这取决于所指定的限定符。
引用限定符可以指定异步调用的可靠性,以及是否应该联合目标组件的方法,使之成为任何客户端事务的一部分。
引用限定符包括:
Asynchronous reliability - 允许发生异步调用。这些限定符还允许您指定消息的可靠性、请求和响应超时。同时也能配置 Service Integration Bus——它在 IBM WebSphere Application Server 运行时中提供消息传递平台,因此对 WebSphere Process Server 可用。(有关 Service Integration Bus 的信息,请参阅参考资料。)
Suspend transaction - 对于同步调用,当使用同步编辑模型进行调用时,客户端全局事务上下文始终会被传播到目标组件。(此限定符只影响客户端全局事务,因为本地事务从不传播到目标组件。)对于客户端不想让目标组件与客户端事务联合的用例,需要使用挂起事务限定符设置来进一步限定引用:
True 会在通过服务引用调用组件之前挂起当前全局事务。
False(缺省值)指示运行时在通过服务引用调用组件之前不要挂起全局事务。
Asynchronous invocation - 确定是否应该进行异步调用(作为任何客户端事务的一部分)。值:
Call(缺省值)指示运行时在进行服务调用的同时将消息提交给异步调用的目的地。
Commit 指示运行时将消息提交给异步调用的目的地的工作交给当前工作范围单元处理。
Suspend activity session - 活动会话能够对可能不支持分布式事务的资源进行更高级的协调。集成解决方案中更可能出现此类情况;客户端不想让目标组件与客户端的活动会话相联合,所以需要使用挂起活动会话限定符设置来进一步地限定引用:
True 会在通过服务引用调用组件之前挂起当前活动会话(如果存在)。
False(缺省值)指示运行时在通过服务引用调用组件之前不要挂起任何处于活动状态的活动会话。
您可以指定引用限定符,以便它们应用于服务组件的所有引用或者只应用于独立引用。如果需要,您还可以为每个引用指定这些限定符,在这种情况下它们将重写任何顶级限定符设置。在 Properties 视图中以灰色表示继承的限定符,以黑色表示已赋值的限定符。继承的限定符不能更改,除非您选择定义它们的所在元素。
接口限定符说明了被目标服务支持的QoS,因此代表了一个与该服务客户端的约定。
接口限定符包括:
Join activity session - 确定目标服务是否愿意加入传播的活动会话范围。值:
True 指示运行时不要在接口边界挂起活动会话(如果存在)。
False(缺省值)指示运行时在接口边界挂起活动会话(如果存在)。
Join transaction - 确定目标服务是否愿意加入传播的全局事务。值:
True 指示运行时不要在接口边界挂起全局事务(如果存在)。
False(缺省值)指示运行时在接口边界挂起全局事务(如果存在)。
Security permission - 使您能够在 SCA 组件上定义 J2EE 角色。只有与声明的角色相关联的客户端才能调用该组件。
所有接口限定符都可以应用于组件的三个级别:
用于其所有接口
用于单个接口
用于某个接口的单个操作。
操作的限定符覆盖接口的限定符;接口的限定符覆盖组件的所有接口的限定符。
实现限定符提供确定服务权限和/或表示其对事务环境的需求的功能。
接口限定符包括:
Activity session - 确定组件的处理是否在一个活动会话中执行,除了全局事务上下文所提供的,它还提供一个备选的工作范围单元。值:
True:组件将在活动会话的上下文中执行。如果活动会话是在调用时出现的,则会添加该组件。
False(缺省值):组件将在现有的全局事务(如果存在)或本地事务的上下文中执行。实现限定符为 activitySession=false 的组件必须使用接口限定符 joinActivitySession=false。
Any:如果存在活动会话,则组件会加入当前活动会话。如果不存在活动会话,则组件会在现有的工作范围单元或本地事务的上下文中执行。
Transaction - 确定组件处理执行的逻辑工作单元。对于逻辑工作单元,事务期间所做的全部数据修改都是作为一个单元一起提交或作为一个单元回滚的:
Global:组件将在全局事务的上下文中执行。如果在调用时存在一个全局事务,则该组件会被添加到该全局事务范围。如果不存在全局事务,则会建立新的事务范围。
Local(缺省值):组件将在本地事务的上下文中执行。
Any:如果存在一个全局事务,则组件将加入当前全局事务范围。如果不存在全局事务,则组件将在本地事务的上下文中执行。
Security identity - 使您能够指定组件担当的身份,与部署描述符上的 J2EE Run-As 约束类似。
限定符是在 SCDL 文件中定义的:接口限定符是在接口部分定义的,实现限定符是在实现部分定义的,引用限定符是在引用部分定义的。(有关详细信息,请查阅WebSphere Process Server Information Center。)




回页首
在对引用有了新的理解之后,我们现在可以将一些组件通过连线连接起来。我们将使用的示例十分简单,但在这个过程中我们也会检查各种可用的服务质量。我们将继续介绍在第 1 部分使用的信贷审批示例。
在我们的示例中:
Credit Approval 组件必须调用 Credit History 组件以及 Credit Agency 组件。
Credit Approval 组件将作为这两个服务的一个 Facade。
Credit Approval 组件需要连线到其他组件。
这一练习所需要的文件可以从本文所附带的下载文件中获得。
启动 WebSphere Integration Developer 并创建一个新的工作区(图 5)。

关闭欢迎屏幕(图 6)。

要从下载的文件导入项目交换文件,请右键单击 Business Integration 视图并选择 Import(图 7)。

选择 Project Interchange,然后单击 Next(图 8)。

假设您已经将下载的文件解压缩到 C: 驱动器,则选择 CreditApprovalPart2.zip 文件,然后单击 Select All 和 Finish(图 9)。

在我们的示例中,我们将使用自底向上的开发风格:我们有一个现有的 SCA 组件集并准备对它们进行集成。从 Business Integration 视图中,您可以检查该 SCA 模块:
展开 CreditApproval 模块(图 10)。

请注意,它有三个接口和三个 Java 实现。打开 CreditApprovalImpl Java 实现并转到 calculateCreditScore() 方法。请注意,calculateCreditScore 同时与 CreditAgency 组件和 CreditHistory 组件进行交互来完成其服务。您很容易想到将 CreditApproval Service 实现为 BPEL 流程或其他组件类型,但在本例中,我们用一个简单的 Java 组件来作为 Facade。
public DataObject calulateCreditScore(DataObject creditApp) { ServiceManager serviceManager = new ServiceManager(); BOFactory bof = (BOFactory)serviceManager.locateService("com/ibm/websphere/bo/BOFactory"); DataObject creditRating = bof.create("http://CreditApproval", "CreditRating"); creditRating.setString("customerId", creditApp.getString("customerId")); CreditAgency creditAgency = (CreditAgency) serviceManager.locateService("CreditAgencyPartner"); Integer creditScore = creditAgency.getCreditScore(creditApp); CreditHistory creditHistory = (CreditHistory) serviceManager.locateService("CreditHistoryPartner"); Double creditLimit = creditHistory.getCreditLimit(creditApp); creditRating.setInt("creditScore", creditScore.intValue()); creditRating.setDouble("creditLimit", creditLimit.doubleValue()); return creditRating; }
要打开 Assembly Editor,请双击 CreditApproval 集合(图 11)。当 Assembly Editor 打开时,会显示三个组件(图 12)。


CreditApproval 组件通过使用简单的 SCA 客户端 API 来与 CreditAgency 和 CreditHistory 进行交互。然而,要让运行时正确地调用这些服务,需要将组件“连线”起来,使用 WebSphere Integration Developer 来进行这一操作非常简单。在我们的示例中,我们将接受缺省值。
选择 CreditAproval 组件并将其连线到 CreditAgency 组件(图 13)。

将显示一个对话框(图 14),表明将在 CreditApproval 组件上创建一个引用。选择 OK。

由于 CreditApproval 组件是一个 Java 组件,所以我们需要用 WebSphere Integration Developer 生成 Java 接口以便能够调用该组件。因此,在下一个对话框(图 15)中选择 Yes。如果 CreditApproval 已经是一个完整的 BPEL 流程,则选择 No。(请记住,在大多数情况下将使用 WSDL 作为集成层中的接口选择。如果 User Interface 是与集成解决方案联合部署的,则可以使用 Java 接口。)

重复步骤 9 到 11,将 CreditApproval 组件连线到 CreditHistory 组件。结果应该与图 16 类似。

因为我们使用 Java 作为我们的实现,所以可以在 Java SE 环境中对组件进行单元测试。正如在第 1 部分所做的,我们很容易在 WebSphere Integration Developer 中调出单元测试工具:
右键单击 CreditApproval 组件并选择 Test Component(图 17)。

将显示单元测试工具。该单元测试功能的一个很好的优点是它允许独立测试组件,并且可以检测引用和创建模拟器。在我们的例子中,我们自己测试集成,所以需要删除模拟器。
切换到 Configurations 选项卡。
展开 Module CreditApproval 模块,突出显示 CreditAgency 和 CreditHistory,并将它们从 Emulators 列表中删除(图 18)。现在,测试 CreditApproval 组件将导致调用 CreditHistory 和 CreditAgency 组件,而不会模拟交互。

切换回 Events 选项卡并突出显示 Invoke 项(图 19)。

填充输入,如图 20 所示。

单击 Continue。
选择 Eclipse 1.4 JVM 选项(图 21)。

检查每个步骤的流程。您可以实际看到流经组件的数据(图 22)。

最终结果应该与图 23 类似。

关闭测试编辑器,不进行保存。
引用和连线是集成解决方案的关键,因为它们抽象出调用的方式和场合。当在 WebSphere Process Server 中运行时,您可以定义想为调用设定的服务质量。例如,您可以使调用异步化、可以更改事务上下文,或者使异步调用更加可靠。这里我们将通过检查引用属性来查看各种 QoS 选项。
选择 CreditApproval 组件上的 CreditAgency 引用,如图 24 所示。

转到 Properties 视图。您将注意到该引用被选中。

在 Details 选项卡上(图 26),将显示被调用的接口和多样性,以及作为目标的连线。您可以更改调用的多样性;对于异步调用,这样可以以一种发布/订阅方式调用几个组件。

切换至 Qualifiers 选项卡(图 27)以设置特定服务质量。

单击 Add 按钮来查看几个可用的服务质量(图 28)。

作为自我练习,您可以试验这些限定符,请记住,这些质量需要在 WebSphere Process Server 运行时中测试。这些限定符包括事务质量和异步质量;要测试事务工作,您需要与资源交互的组件。特定服务质量是在接口中定义的。这使得该组件能够控制其他组件调用它的方式。
突出显示 Assembly Editor 中的 CreditApproval 接口(图 29),或者导航至 Properties 编辑器。

检查服务质量限定符(图 30)和实现限定符。请注意,这些限定符是在被调用的服务(而不是调用它的服务)上定义的。

要测试服务质量,您通常需要在 WebSphere Process Server 中运行,或者在 WebSphere Integration Developer 中为测试提供的 WebSphere Process Server 运行时运行。
在 Servers 视图中,右键单击该服务器并选择 Start(图 31)。


当服务器启动后,您可以按照管理控制台中的指示(图 32),以一种类似于添加 J2EE 应用程序的方式将该 SCA 模块添加到服务器中,因为 SCA 模块被包装成 EAR 文件(如第 1 部分所提到的)。再次右键单击服务器并选择 Add and remove rojects...(图 33)。

选择 CreditApprovalApp 并将它添加到已配置的项目一侧(图 34)。

检查管理控制台,确保 SCA 模块已启动(图 35)。

要使用同一 WebSphere Integration Developer 单元测试功能来测试该组件,请按照前面所执行的操作,再次右键单击该组件,然后选择 Test Component(图 36)。

再次说明,请删除模拟器,以使测试能够流经 SCA 组件(图 37)。

键入输入参数,如图 38 所示。

选择 WebSphere Process Server V6.0 作为部署位置(图 39)。

检查测试结果。
作为自我练习,请更改组件以进行数据库更新,然后试验事务属性。您也可以在管理控制台中使调用异步化以及检查基础 Service Integration Bus 配置。