引言
您可能认为,这太棒了,又出现了一个编程模型,但事实并非如此。Web 服务怎么样了?Enterprise JavaBeans 发生了什么?服务组件体系结构 (SCA) 并非要替换任何现有的编程模型或者与其抗衡。相反,SCA 向您提供一个以与技术无关的方式定义接口、实现和引用的模型,从而使您能够将这些元素绑定到所选择的某一技术的特定实现。
例如,我们可以用 Java 定义我们的接口,将我们的实现作为 BPEL 流程加以应用,或者将接口作为一个 WSDL 文档,而且我们的实现可以是一个 Java™ 类。图 1 演示了如何在 IBM WebSphere Process Server 中使用 SCA。
图 1. WebSphere Process Server 中的 SCA
使用 WebSphere Process Server,集成开发人员可以拥有各种不同的现成实现技术,并且可以采用开放标准(如通过 Java 或者 WSDL)来公开接口。此外,SCA 还提供了一个客户机编程模型,通过该模型,客户机可以访问服务组件。这使得开发人员可以继续使用他们熟悉的各种技术(如 Enterprise JavaBeans™ (EJB))进行开发,并且使用 SCA 将这些组件连接在一起。
SCA 的另一个主要部分是它还定义了一个标准模型,用于定义组件之间的依赖项。因此,通过使用引用连接 SCA 组件,可以定义依赖项。
图 2. 定义组件之间的依赖项
最后,SCA 定义了一个标准的部署模型,用于将组件打包到服务模块。可以定义 SCA 组件以及与其相关联的依赖项,并且将它们打包到部署单元。
图 3. 与依赖项一起打包的组件
SCA 模块并非只是另一种类型的包。在 WebSphere Process Server 中,SCA 服务模块等同于一个 J2EE EAR 文件和许多其他 J2EE 子模块。J2EE 元素(如 WAR 文件)可以与 SCA 模块一起打包。非 SCA 构件(JSP 以及其他构件)也可以同 SCA 服务模块打包在一起,这使得它们可以使用一种称为独立引用的特殊类型的引用,来通过 SCA 客户机编程模型调用 SCA 服务。
图 4. 用于非 SCA 构件的独立引用
SCA 与集成有着紧密的联系;我们将上述引用作为一种定义 SCA 组件之间的依赖项的方式进行了描述。例如,我们可以定义对同一个模块内的另一个 SCA 组件的引用。当使用引用调用同一个模块内的服务组件时,数据通过引用进行传递。SCA 定义了调用组件或其他 SCA 服务(位于其他 SCA 模块内)的方式。
用于模块到模块和模块到外部服务调用的这两种机制称为导入和导出。
导入和导出是从模块的角度表述的。模块是一组执行特定业务功能的自包含 (self-contained) 组件。
当模块需要向另一个实体(外部服务或其他模块)提供功能来调用业务功能时,它将导出该功能。导出使得可以通过多种不同的传输协议来使用此服务。导出与模块内的某个特定组件相关联。
当模块需要利用另一个实体(外部服务或模块)的功能时,模块将导入该功能。导入还提供了通过多种传输协议与服务提供者交互的功能。
图 5 阐释了这些概念。
图 5. SCA 导入和导出
导入和导出是抽象概念。它们需要绑定到某一特定技术。WebSphere Process Server V6.0 中提供的绑定类型有:
- SCA(用于 SCA 模块到模块)
- Web 服务
- JMS
- 无状态会话 Bean。
当通过导入和导出调用 SCA 组件时,参数通过值进行传递。
图 6. SCA 导入和导出
连接 SCA 组件的网络将大部分基础结构级别的代码抽象出来。例如,我们可以将网络定义为同步或异步,将操作定义为单向或请求-响应,我们也可以定义组件之间的事务行为。SCA 为您处理基础结构方面的细节。我们将在这一系列文章中对这些细节进行更详细的描述。
导入和导出还可以绑定到其他技术,例如 JMS、Enterprise JavaBean 或者 Web 服务。这样,Web 服务客户机就可以调用 SCA 模块,而 SCA 模块就可以使用 SCA 编程模型调用现有的 Enterprise JavaBean。
图 7. 使用其他技术的导入和导出
我们将在本系列的后续文章中讨论导入和导出。
数据方面的情况如何?
SCA 向我们提供了一个用于定义业务服务的通用模型。服务数据对象 (SDO) 提供了一种用通用模型来表示数据的方法。可以将 SCA 组件组合在一起,并且通过传递 SDO 来以一种中立的方式相互交换数据。SDO 体系结构中的基本概念是数据对象,它是用于存放基元类型的数据和/或其他数据对象的数据结构。数据对象还存放对元数据的引用,元数据提供有关包含在数据对象中的数据的信息。
在 SDO 编程模型中,数据对象是以 commonj.sdo.DataObject Java 接口定义表示的。该接口包含方法定义,通过方法定义,客户机可以获取和设置与数据对象相关联的属性。SDO 体系结构中的另一个重要概念是数据图,它是封装一组数据对象的结构。对于包含在数据图中的顶层数据对象,可以从根数据对象开始遍历引用来到达所有子数据对象。数据图中的另一个重要功能是更改摘要,用于记录关于在处理过程中已经更改的图中的数据对象和属性的信息。(有关 SDO 的详细信息,请参阅参考资料。)
WebSphere Process Server 通过业务对象实现 SDO 规范。SCA 组件可以通过传递业务对象来交换数据,如图 8 所示。
图 8. WebSphere Process Server 业务对象
与 SDO 包装在数据图中一样,业务图用于包装顶层业务对象,并且提供用来补充包含在图中的数据的附加信息。具体来说,业务图包括图中数据的更改摘要(类似于 SDO 更改摘要信息)、事件摘要和谓词信息(用于 EIS 系统之间的数据同步)。业务图与 SDO 体系结构中的数据图的概念非常相似。然而,新增信息的事件摘要和谓词部分没有包含在 SDO 数据图概念中。
SCA 101
既然我们已经概括地介绍了 SCA,就可以通过一个示例来讨论某些具体细节。在构建示例的过程中,我们将对 IBM WebSphere Integration Developer 进行概述,您可以使用该工具来以可见的方式构建和集成 SCA 组件。
概述
为了演示 SCA 和业务对象的各个方面,我们将讨论与一个业务案例有关的这些概念。与所有开发工作一样,开发周期必须从需求开始。该场景中的需求包括创建信用审批服务,该服务将接收关于申请者 (CreditApplication) 的信息,并通过信用等级 (CreditRating) 进行响应。
SCA 中最简单的部分是服务组件。如前所述,服务组件是由一个接口和一个实现构成的。用来“编码”这些构件的技术可以有所不同;在 WebSphere Process Server 中,接口可以是 Java 或者 WSDL。Java 接口可以是 Plain Old Java Interface (POJI),如下所示:
清单 1
public interface CreditRequest
{
public DataObject calulateCreditScore(DataObject creditApp)
throws ServiceBusinessException;
}
|
如果您使用 Java 实现,则可以创建一个简单的 POJO。下面是一个用作 SCA 实现的 POJO 的示例:
清单 2
public class CreditApprovalImpl implements CreditRequest {
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"));
creditRating.setInt("creditScore", 750);
creditRating.setDouble("creditLimit", 10000d);
return creditRating;
}
}
|
在这个实现类中,我们使用 CreditApplication 输入创建一个简单的 CreditRating 业务对象,然后我们将该业务对象返回到调用程序。
服务组件是在服务组件定义语言(Service Component Definition Language,SCDL)文件中定义的。使用 SCDL 创建的组件文件与 EJB 部署描述符有些类似,这是因为它定义了接口、实现和 SCA 组件的多个服务质量需求。上述 Java 类的 SCDL 文件如下所示:
清单 3
<?xml version="1.0" encoding="UTF-8"?>
<scdl:component xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:java="http://www.ibm.com/xmlns/prod/websphere/scdl/java/6.0.0"
xmlns:ns1="http://CreditApproval/CreditRequest"
xmlns:scdl="http://www.ibm.com/xmlns/prod/websphere/scdl/6.0.0"
xmlns:wsdl="http://www.ibm.com/xmlns/prod/websphere/scdl/wsdl/6.0.0"
displayName="CreditApproval" name="CreditApproval">
<interfaces>
<interface xsi:type="java:JavaInterface" interface="CreditRequest " >
<method name="calulateCreditScore"/>
</interface>
</interfaces>
<implementation xsi:type="java:JavaImplementation" class=" CreditApprovalImpl"/>
</scdl:component>
|
类似地,我们可以使用 WSDL 表示接口,如下所示:
清单 4
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions xmlns:bons1="http://CreditApproval"
xmlns:tns="http://CreditApproval/CreditRequest"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="CreditRequest"
targetNamespace="http://CreditApproval/CreditRequest">
<wsdl:types>
<xsd:schema targetNamespace="http://CreditApproval/CreditRequest"
xmlns:bons1="http://CreditApproval"
xmlns:tns="http://CreditApproval/CreditRequest"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:import namespace="http://CreditApproval"
schemaLocation="xsd-includes/http.CreditApproval.xsd"/>
<xsd:element name="calulateCreditScore">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="CreditApp" nillable="true"
type="bons1:CreditApp"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="calulateCreditScoreResponse">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="CreditRating" nillable="true"
type="bons1:CreditRating"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
</wsdl:types>
<wsdl:message name="calulateCreditScoreRequestMsg">
<wsdl:part element="tns:calulateCreditScore"
name="calulateCreditScoreParameters"/>
</wsdl:message>
<wsdl:message name="calulateCreditScoreResponseMsg">
<wsdl:part element="tns:calulateCreditScoreResponse"
name="calulateCreditScoreResult"/>
</wsdl:message>
<wsdl:portType name="CreditRequest">
<wsdl:operation name="calulateCreditScore">
<wsdl:input message="tns:calulateCreditScoreRequestMsg"
name="calulateCreditScoreRequest"/>
<wsdl:output message="tns:calulateCreditScoreResponseMsg"
name="calulateCreditScoreResponse"/>
</wsdl:operation>
</wsdl:portType>
</wsdl:definitions>
|
实现类可能与之相同(唯一不同的是,它显然没有实现任何 Java 接口,因为它定义为 WSDL)。
我们的 SCDL 文件可以将接口绑定到 WSDL 文档:
清单 5
<?xml version="1.0" encoding="UTF-8"?>
<scdl:component xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:java="http://www.ibm.com/xmlns/prod/websphere/scdl/java/6.0.0"
xmlns:ns1="http://CreditApproval/CreditRequest"
xmlns:scdl="http://www.ibm.com/xmlns/prod/websphere/scdl/6.0.0"
xmlns:wsdl="http://www.ibm.com/xmlns/prod/websphere/scdl/wsdl/6.0.0"
displayName="CreditApproval" name="CreditApproval">
<interfaces>
<interface xsi:type="wsdl:WSDLPortType" portType="ns1:CreditRequest">
<method name="calulateCreditScore"/>
</interface>
</interfaces>
<implementation xsi:type="java:JavaImplementation" class="CreditApprovalImpl"/>
</scdl:component>
|
SCDL 用于描述 SCA 的组成部分,如模块、引用、导入和导出。您将在本系列中看到它们的示例。SCDL 定义是由多个文件组成的。例如,我们将接口和实现的 SCDL 存储在一个名为 CreditApproval.component 的文件中。引用可以包含在 CreditApproval.component 文件(内联)中,也可以包含在 Module 根目录下的一个单独的 sca.references 文件中。所有独立引用都将放置在 sca.references 文件中,如下所示。如前所述,同一个 SCA 模块内的非 SCA 构件 (JSP) 可以使用独立引用调用 SCA 组件。
清单 6
<?xml version="1.0" encoding="UTF-8"?>
<scdl:references xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:java="http://www.ibm.com/xmlns/prod/websphere/scdl/java/6.0.0"
xmlns:scdl="http://www.ibm.com/xmlns/prod/websphere/scdl/6.0.0">
<reference name="CreditRequestPartner">
<interface xsi:type="java:JavaInterface" interface="approval.credit.credit.request.CreditRequest">
<method name="calulateCreditScore"/>
</interface>
<wire target="CreditApproval"/>
</reference>
</scdl:references>
|
在我们的示例中,我们将定义的第三个文件是 sca.module。该 SCDL 文件包含模块的定义:
清单 7
<?xml version="1.0" encoding="UTF-8"?>
<scdl:module xmlns:scdl="http://www.ibm.com/xmlns/prod/websphere/scdl/6.0.0" name="CreditApproval"/>
|
虽然我们为组件定义了一个 WSDL 接口,但是请注意,我们能够将另一个 Java 接口添加到独立引用,并将其连接到我们的目标组件。通过这种方式,Java 客户机可以使用一个简单的 POJI 调用 SCA 组件。WebSphere Integration Developer 将提供在 Java 接口和 WSDL 接口之间转换调用的选项。在创建了第一个 SCA 组件后,您将很快看到这样一个示例。
在这一系列文章中,我们将看到 SCDL 如何定义其他 SCA 构件(如服务引用、导入和导出)的示例。WebSphere Integration Developer 使用上述 SCDL 文件的命名约定,实际情况就是如此。在我们的示例中,在构建第一个 SCA 组件时,您将使用 WebSphere Integration Developer。然而,SCA 应用程序也可以使用记事本进行构建。
WebSphere Integration Developer 和 WebSphere Process Server
在本文中,您将使用 WebSphere Integration Developer 和 WebSphere Process Server 来构建并运行 SCA 组件。
WebSphere Integration Developer 用于开发运行于 WebSphere Process Server V6 上的应用程序。WebSphere Integration Developer 基于 Eclipse 3.0 平台,它为集成项目提供了基于角色的开发。您可以将 WebSphere Integration Developer 和 IBM WebSphere Business Modeler V6 与 IBM Rational® Application Developer V6 或 IBM Rational Software Architect V6 一起作为集成开发平台。J2EE 开发人员、业务分析人员或集成开发人员可以使用基于其独特角色的工具透视图,这样每个开发人员都可以将注意力集中在这些角色所需的编辑器和工具上,从而大大提高了工作效率。
WebSphere Process Server 是一个基于 WebSphere Application Server V6 的综合集成平台。WebSphere Process Server 用于在面向服务的体系结构中执行基于组件的业务集成应用程序。由于它基于 WebSphere Application Server 提供的 J2EE 1.4 基础结构和平台服务,因此 WebSphere Process Server 包括诸如业务流程自动化之类的功能。
有关 WebSphere Integration Developer 和 WebSphere Process Server 的详细信息,请参阅参考资料。
构建第一个 SCA 项目
现在,您可以构建第一个 SCA 项目了。在本例中,您将构建一个简单的信用审批组件。该组件接收一个具有 ID 和名称的数据对象,然后返回另一个包含信用分数和信用额度的数据对象。下载本文所附的 zip 文件,并将其解压缩到硬盘上。本指导假设您将 zip 文件解压缩到 C: 盘上。
WebSphere Integration Developer V6.0 是一个灵活的开发环境,它为自底向上或自顶向下开发 SCA 应用程序提供了工具和向导。
为了创建信用审批服务,我们将研究自顶向下开发的各个方面。自顶向下开发过程的一般步骤大致如下:
- 创建 SCA 模块。
- 创建业务对象。
- 定义服务接口。
- 生成组件并提供实现。
- 对 SCA 组件进行单元测试。
- 提供独立引用。
- 使用简单的 JSP 客户机测试服务。
创建 SCA 模块
首先,您需要创建一个 SCA 模块。如前所述,SCA 模块是 SCA 组件的打包构造。
-
在 WebSphere Integration Developer 中打开一个空白工作区。(图 9)
图 9. 在 WebSphere Integration Developer 中打开一个空白工作区
-
关闭 Welcome 屏幕。
-
接下来,您需要创建一个新模块。
-
在 WebSphere Integration Developer 工作台中,打开业务集成透视图。找到 Business Integration 视图。
-
在 Business Integration 视图内单击鼠标右键,然后选择 New => Module。(图 10)
图 10. 创建新模块
-
New Module 向导应该出现(图 11)。将该模块命名为 CreditApprovalSCAModule
。
图 11. 创建新模块
-
现在,Business Integration 视图中应该显示一个新项目。SCA 模块是作为 SCDL 文件描述的。Business Integration 视图向您展示了 SCA 模块的逻辑视图。如前所述,您可以打开 Physical Resource 视图,来查看包含在 SCA 模块中的物理资源。SCA 模块的 SCDL 包含在名为 sca.module 的文件中。如果您使用文本编辑器打开该文件,应该看到以下内容:
清单 8
<?xml version="1.0" encoding="UTF-8"?>
<scdl:module xmlns:scdl="http://www.ibm.com/xmlns/prod/websphere/scdl/6.0.0" name="CreditApprovalSCAModule"/>
|
创建业务对象
对于创建接口或业务对象,没有预先定义的任务顺序;只需要在创建接口时简单地创建业务对象即可。这里我们选择在 Business Integration 视图中创建业务对象。
在创建业务对象时,实际上您正在创建 XML 模式。业务对象作为标准的 XML 模式进行存储。应用程序可以使用 SDO 编程模型和 XPath 访问数据。
通过业务对象编辑器,我们可以创建信用审批服务将使用的业务对象定义。我们的服务需要两个业务对象。
CreditApplication:包含计算信用等级所需的信用申请者的有关信息。信用应用程序业务对象 (CreditApplication) 包含三个属性:
-
Customer Id:客户的唯一标识符
-
First Name:客户的名字
-
Last Name:客户的姓氏
CreditRating:包含信用等级信息,如信用分数和信用额度。信用等级业务对象 (CreditRating) 包含三个属性:
-
Credit Score:客户基于先前历史记录的信用分数
-
Credit Limit:客户可借贷的总金额。
-
我们首先创建请求业务对象,它用作 SCA 组件的输入参数。
-
请确保 CreditApprovalSCAModule 已展开。右键单击 Data Types,然后选择 New => Business Object。(图 12)
图 12. 创建新业务对象
-
将业务对象命名为 CreditApplication
,如图 13 所示。
图 13. 定义业务对象
-
该业务对象应该在业务对象编辑器中打开。现在,Data Types 菜单下应该有 CreditApplication。(图 14)
图 14. 业务集成菜单
-
现在,我们将定义 CreditApplication 业务对象的属性。
-
您可以通过选择 Add Attribute 图标添加属性,如图 15 所示。
图 15. Add Attribute 图标
-
输入 customerId
作为属性名称,并接受缺省的 String 类型。(要更改类型,您只需选择类型字段,并从下拉框中选择类型。您需要为响应对象进行此操作。)
图 16. 定义属性
-
再添加两个 String 属性,并将其命名为 firstName
和 lastName
。这两个属性应该是字符串类型,如下所示。
图 17. 定义属性
-
该业务对象是使用标准的 XML 模式类型定义的。您可以使用 XML 编辑器打开该业务对象,以便进行查看。(通过右键单击业务对象并选择 Open with => 和您选择的编辑器,您可以在文本编辑器中打开该业务对象。)
-
保存并关闭业务对象编辑器。
图 18. 定义的业务对象
-
XML 模式应该类似于下面的代码示例。
清单 9
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://CreditApprovalSCAModule">
<xsd:complexType name="CreditApplication">
<xsd:sequence>
<xsd:element minOccurs="0" name="customerId" type="xsd:string"/>
<xsd:element minOccurs="0" name="firstName" type="xsd:string"/>
<xsd:element minOccurs="0" name="lastName" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
|
-
现在,我们要创建第二个业务对象来表示响应。
-
按照上面同样的步骤,创建另一个业务对象。该业务对象有三个字段:
- 字符串类型的 customerId
- 整数类型的 creditScore
- 双精度类型的 creditLimit
-
如前所述,您可以通过选择类型列更改类型,如图 19 所示。
图 19. 更改属性类型
-
保存并关闭业务对象编辑器
现在,您已经创建了两个业务对象。
定义服务接口
现在,您可以创建 SCA 接口了。此外,信用审批服务是一个请求-响应服务,它接收信用应用程序并同时返回信用等级。服务接口定义服务客户机和服务提供者之间的交互。
有多种创建接口的方式。如果您选择 Java 接口,可以使用 WebSphere Integration Developer 中的 Java Eclipse 工具来进行创建。在我们的示例中,我们将在业务集成透视图中创建 WSDL 接口。您可以使用 Assembly Editor 创建,也可以使用业务集成视图创建。我们将使用后者。(稍后,我们将使用 Assembly Editor 创建实现。)
-
首先,我们将使用 Business Integration 视图菜单创建接口。
-
右键单击 Interfaces 菜单项,然后选择 New => Interfaces,如图 20 所示。
图 20. 创建新接口
-
在 New Interface 菜单中,输入名称 CreditApproval
。(请记住出于演示的目的,在我们的示例中,我们使用的是缺省包和文件夹。您可以选择一个文件夹,轻松地按功能对不同的接口进行分组。)
图 21. 创建新接口
-
CreditApproval 接口是一个简单的 WSDL 文件。WebSphere Integration Developer 附带了一个简单的 WSDL 编辑器,可以用来构建接口。
-
在创建接口时,接口编辑器应该已经打开。如果接口编辑器尚未打开,可以在业务集成视图中双击接口,以将接口编辑器打开。
-
首先,我们要创建一个简单的请求-响应操作。(您还可以创建用于异步调用的单向操作,但是现在,我们只创建简单的同步请求。)单击 Add Request Response Operation 图标,如图 22 所示。
图 22. Add Request Response Operation 图标
-
将在编辑器中创建一个操作。将该操作命名为 calculateCreditRating
。(图 23)
图 23. 定义操作
-
现在我们需要定义参数。请记住,我们创建了两个业务对象,一个用于输入,另一个用于输出。在创建操作后,选择 Add Input 图标,如图 24 所示。
图 24. Add Input 图标
-
将输入命名为 CreditApplication
。
-
选择 Type 列并找到 CreditApplicaiton 业务对象。您可以看到,业务对象现在是一个有效类型,可以用于构建接口,如图 25 所示。(在这里你可以选择创建新业务对象。)
图 25. 新业务对象现在是一个有效类型
-
接下来,选择 Add Output 图标,如图 26 所示。
图 26. Add Output 图标
-
选择 CreditRating 作为类型,类似于选择输入的类型。
图 27. 定义输出
-
保存并关闭接口编辑器。
-
如果您希望检查 WSDL 文件,可以在 Physical Resources 视图中右键单击 CreditApproval.wsdl 文件,然后使用文本编辑器打开该文件。(图 28)
图 28. 查看 WSDL 文件
WSDL 文件应该类似于下面的代码示例。
清单 10
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions xmlns:bons1="http://CreditApprovalSCAModule"
xmlns:tns="http://CreditApprovalSCAModule/CreditApproval"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
name="CreditApproval" targetNamespace="http://CreditApprovalSCAModule/CreditApproval">
<wsdl:types>
<xsd:schema targetNamespace="http://CreditApprovalSCAModule/CreditApproval"
xmlns:bons1="http://CreditApprovalSCAModule"
xmlns:tns="http://CreditApprovalSCAModule/CreditApproval"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:import namespace="http://CreditApprovalSCAModule"
schemaLocation="xsd-includes/http.CreditApprovalSCAModule.xsd"/>
<xsd:element name="calculateCreditRating">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="CreditApplication" nillable="true"
type="bons1:CreditApplication"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="calculateCreditRatingResponse">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="CreditRating" nillable="true"
type="bons1:CreditRating"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
</wsdl:types>
<wsdl:message name="calculateCreditRatingRequestMsg">
<wsdl:part element="tns:calculateCreditRating"
name="calculateCreditRatingParameters"/>
</wsdl:message>
<wsdl:message name="calculateCreditRatingResponseMsg">
<wsdl:part element="tns:calculateCreditRatingResponse"
name="calculateCreditRatingResult"/>
</wsdl:message>
<wsdl:portType name="CreditApproval">
<wsdl:operation name="calculateCreditRating">
<wsdl:input message="tns:calculateCreditRatingRequestMsg"
name="calculateCreditRatingRequest"/>
<wsdl:output message="tns:calculateCreditRatingResponseMsg"
name="calculateCreditRatingResponse"/>
</wsdl:operation>
</wsdl:portType>
</wsdl:definitions>
|
生成组件并提供实现
现在,我们可以创建 SCA 实现了。此时,我们已经创建了标准的接口和业务对象。现在我们要定义 SCA 组件。您将使用 SCA Assembly Editor 来完成此操作。
-
首先,我们要定义 SCA 组件。
-
通过双击 CreditApprovalSCAModule 菜单项,打开 SCA Assembly Editor,如图 29 所示。
图 29. 打开 SCA Assembly Editor
-
SCA Assembly Editor 有一个面板,可以用于创建 SCA 构件。您也可以从各种视图中拖动某些构件。只需将 CreditApproval 接口拖至 Assembly Editor,如图 30 所示。(或者,您也可以从面板拖动 Java 组件,然后将其与接口相关联。)
图 30. 将接口拖至 Assembly Editor
-
将出现一个文本框。选择 Component with No Implementation Type,如图 31 所示。
图 31. 组件创建文本框
-
现在,您应该在 Assembly Editor 上看到一个名为 Component1 的 SCA 组件。(图 32)
图 32. SCA 组件图标
-
通过选择组件并键入名称,您可以更改名称;或者可以使用属性编辑器更改名称,如图 33 所示。将显示名称更改为 CreditApproval
。名称字段应该自动更改。
图 33. 更改组件名称
-
现在,我们的 SCA 组件具有接口,但没有实现。现在我们要使用 Assembly Editor 生成实现。
-
通过在 Assembly Editor 中右键单击组件并选择 Generate Implementation => Java,生成一个框架实现。(图 34)
图 34. 生成框架实现
-
新 Java 实现应该在 Java 编辑器中打开;您将看到 calculateCreditRating。下载文件中提供了简单的代码段,位置为 C:\SCA_ArticleSeries\Part1\CodeSnippet1.txt。方法如下所示。
清单 11
public DataObject calculateCreditRating(DataObject creditApplication) {
// Create and return a credit rating object.
System.out.println("********* credit approval service invoked ******");
ServiceManager serviceManager = new ServiceManager();
BOFactory bof = (BOFactory)serviceManager.locateService("com/ibm/websphere/bo/BOFactory");
System.out.println("********* BOFactory created ******");
DataObject creditRating = bof.create("http://CreditApproval", "CreditRating");
System.out.println("********* credit rating object created ******");
creditRating.setString("customerId", creditApplication.getString("customerId"));
creditRating.setInt("creditScore", 750);
creditRating.setDouble("creditLimit", 10000d);
System.out.println("********* returning credit rating object ******");
return creditRating;
}
|
-
这些代码使用 SCA 服务管理器查找业务对象工厂 (Business Object Factory),后者用于从 XML 模式中创建业务对象。出于演示的目的,我们创建响应数据对象,并返回硬编码的数据。
-
如果您粘贴代码,则可能出现一些编译错误。通过右键单击编辑器并选择 Source => Organize Imports,您可以更正这些错误,如图 35 所示。
图 35. 更正错误
-
保存并关闭 Java 文件,但是 Assembly Editor 保持打开状态。
对 SCA 组件进行单元测试
WebSphere Integration Developer 提供了使用单元测试工具对组件进行单元测试的功能。根据 SCA 实现的类型,您可以在 J2SE 环境中测试 SCA 组件,通过该环境,可以在没有完整的应用程序服务器的情况下测试组件;当然,这在很大程度上取决于您具有的组件的类型。可以在 J2SE 环境中轻松地对 Java 实现进行测试,但是由 BPEL 流程实现的 SCA 组件需要 BPEL 引擎(如 WebSphere Process Server)。在我们的示例中,我们将使用测试组件功能来测试 SCA 组件。
要启动测试组件功能,请执行以下步骤:
-
在 SCA Assembly Editor 中右键单击 CreditApproval 组件,然后选择 Test Component。(图 36)
图 36. 启动测试组件功能
-
这将启动测试组件编辑器。在该工具的右侧,输入测试数据,如图 37 所示,然后单击 Continue。
图 37. 输入测试数据
-
将显示可用的运行时列表。选择 Eclipse 1.4 JVM,然后单击 Finish。(图 38)
图 38. 运行时部署位置
-
要开始测试,请选择 Return 项,如图 39 所示。监视 Events 窗口以查看流程。
图 39. Events 窗口
-
您将在右侧看到结果。(图 40)
图 40. 单元测试结果
创建 SCA 客户机 Web 应用程序并在 WebSphere Process Server 中进行测试
-
要让打包在同一 SCA 部署中的非 SCA 组件调用 SCA 组件,我们需要创建独立引用:
-
在 SCA Assembly Editor 中,请选择面板中 Import 图标旁边的 arrow。这将打开一个更小的子菜单。选择 Standalone references 图标,并将其拖至 Assembly Editor 中的任何位置,如图 41 所示。
图 41. 创建独立引用
-
单击 Stand-alone References 框的内部(而非文本),并将其拖至 Credit Approval 组件,如图 42 所示。
图 42. 创建匹配引用
-
单击 OK,创建匹配引用。(图 43)
图 43. 创建匹配引用
-
下一文本框将向您提供生成 Java 接口的选项。请记住,您创建了 WSDL 接口。然而,WebSphere Integration Developer 要生成等效的 Java 接口,以使 Java 客户机使用 SCA API 交互。选择 Yes。(图 44)
图 44. 接口转换验证
-
有了独立引用后,现在我们可以在同一模块的非 SCA 组件中调用 SCA 组件。请记住,SCA 模块是由 EAR 文件实现的,因此您可以将其他 J2EE 组件添加到 SCA 模块。在我们的示例中,我们要导入具有 JSP 文件的现有 WAR 文件。WAR 文件将是基础 EAR 文件的一部分。
-
选择 File => Import,调出 Import 向导。选择 WAR file,然后单击 Next。(图 45)
图 45. 从非 SCA 组件中调用 SCA 组件
-
选择 C:\SCA_ArticleSeries\Part1\CreditApprovalClient.war。取消选择 Add module to an EAR Project。
图 46. 导入 WAR 文件
-
选择 Yes,以转到 Web 透视图。(图 47)
图 47. 转到 Web 透视图
-
打开 JSP 文件,以检查代码。您将在 Dynamic Web Projects 目录下找到该文件,如图 48 所示。JSP 称为 creditApprovalClient.jsp。
图 48. Dynamic Web Projects 目录
-
我们使用简单的 JSP 接收输入并使用 SCA API 调用 SCA 组件。(请记住,为了使用 MVC,该 JSP 遵循最佳实践)。
-
SCA 具有 Dependency Editor,通过该编辑器,可以将不同的包添加到 SCA 模块:
-
通过右键单击 CreditApprovalSCAModule 并选择 Open Dependency Editor,打开 Dependency Editor。(图 49)
图 49. 打开 Dependency Editor
-
展开 J2EE 部分,然后单击 Add 按钮。(图 50)
图 50. 配置依赖项
-
选择 CreditApprovalClient Web 项目,如图 51 所示。
图 51. 选择 Web 项目
-
请确保未选中 On Build Path。(Build Path 将该组件添加到 SCA 模块的类路径。在我们的示例中,我们需要使 WAR 文件依赖于 SCA 模块。)保存 Dependency Editor。这使得 WAR 文件成为 EAR 文件的一部分。
图 52. 设置依赖项
-
要让 Web 项目知道 SCA Java 接口,可以右键单击 Web 项目并选择 Properties。
-
转到 Java JAR Dependencies 并选择 CreditApprovalSCAModuleEJBClient.jar,它是在下面生成的 EJB 客户机 JAR 文件。(图 53)
图 53. 设置依赖项
-
关闭编辑器。此时,您可以选择执行整体构建。这可能没有必要,但我们总是喜欢在部署前进行整体构建。如果您有自动构建,可以进行清理,如图 54 所示。
图 54. 用于自动构建的清理
-
现在,我们可以在 WebSphere Process Server 上部署并测试我们的 SCA 组件和 Web 客户机了。请记住,我们的 SCA 模块是由 J2EE 应用程序实现的。您可以转到 J2EE 透视图来查看构件。请记住,它们是生成的构件。(我们以后将在这一系列文章中进行介绍。)
图 55. J2EE 透视图
-
转到 Business Integration 透视图底部的 Servers 视图。右键单击 WebSphere Process Server,然后选择 Start,如图 56 所示。
图 56. 启动 WebSphere Process Server
-
等待服务器启动。检查控制台并等待图 57 中所示的消息。
图 57. WebSphere Process Server 启动消息
-
再次右键单击服务器并选择 Add and remove projects。(图 58)
图 58. 添加和删除项目
-
选择 CreditApprovalSCAModuleAdd,然后选择 Add,如图 59 所示。这会将其移到右侧的 Configured projects 框中。
图 59. 在服务器上配置项目
-
监视右下角的进度,等待部署应用程序。(图 60)
图 60. 项目部署监视器
-
在控制台验证 CreditApporvalSCAModuleApp 已经启动。(图 61)
图 61. 管理控制台消息
-
转到 Web 透视图。右键单击 JSP,然后选择 Run => Run on Server,如图 62 所示。
图 62. 运行应用程序
-
选择现有的 WebSphere Process Server,接着选择 Set server as project default,然后单击 Finish。(图 63)
图 63. 设置服务器
-
当应用程序执行时,输入图 64 中所示的应用程序测试数据。
图 64. 输入 SCA 应用程序测试数据
-
您应该获得图 65 所示的结果。
图 65. SCA 应用程序测试结果
-
关闭浏览器并停止服务器。
祝贺您!您已经创建并测试了第一个 SCA 组件!
结束语
服务组件体系结构 (SCA) 是面向服务的体系结构 (SOA) 中的一个主要变化。SCA 向我们提供了 SOA 的编程模型,并将在今后作为集成的基础。请继续关注本系列的后续文章,我们将研究特定 SCA 功能的细节以及它们可给您的应用程序带来的好处。