UML软件工程组织

 

 

使用服务组件体系结构构建 SOA 解决方案——第 4 部分
 
作者:Roland Barcia, 认证 IT 专家, Jeff Brent, 顾问软件工程师,  来源:IBM
 

使用 Java® Message Service (JMS) 和 Web 服务将服务组件体系结构 (SCA) 解决方案与其他系统集成是集成异类系统的两种常用方法——它们还让您能够解决集成中固有的许多复杂难题。

 引言

在此系列文章的第 3 部分中,我们向您介绍了服务组件体系结构 (SCA) 导入和导出,并侧重介绍了如何将它们用作集成 SCA 模块的机制。在第 4 部分中,我们将对此做进一步的讨论,向您介绍如何使用 JMS 和 Web 服务将 SCA 解决方案与其他系统集成。集成是非常困难的,因为它涉及对使用不同技术编写的、在不同平台部署的系统进行组合,并且还涉及数据传输、连接和许多其他方面的各种难题。Web 服务和 JMS 是集成异类系统的两种常用方法——它们还让您能够解决许多此类复杂难题。

集成系统

我们将对第 3 部分中使用的示例进行扩展,并对其加以增强,以调用外部系统。考虑到本文的目的,我们假设您已完全了解本系列文章的前几部分。下面的图 1 说明了我们将使用的示例。

图 1. JMS 和 Web 服务集成
 

请记住,我们在模仿各种开发组(包括内部和外部)。在实际的系统中,出于性能原因,您可能希望将所有相关 SCA 组件分组成单个模块。

JMS 绑定

IBM? WebSphere? Process Server 和 IBM WebSphere Enterprise Service Bus (ESB) 支持导入和导出以便与 JMS 绑定。与任何导入和导出极为类似,您必须首先定义一个有效的 SCA 接口(在 WebSphere Process Server 或 WebSphere ESB 中,该接口既可以是 WSDL 文件,也可以是 Java 接口),然后使用 WebSphere Information Integrator 将导入或导出与 JMS 绑定。IBM WebSphere Integration Developer 提供了 Properties 视图,在此视图中,您可以查看和更改绑定值。这是您随后提供必要 JMS 信息的位置。

对于 JMS 导入,调用 SCA 接口将转换为将请求消息写入指定 JMS 目的地,并且,如果需要应答,还可以从应答队列读取(可选)。WebSphere Process Server 和 WebSphere ESB 允许您写入底层 WebSphere Messaging(有时也称为服务集成总线(Service Integration Bus,SIBus))或 WebSphere MQ。

对于 JMS 导出,送达绑定目的地会触发对连接导出的 SCA 组件的调用。

在使用 WebSphere Integration Developer 时,您可以配置 JMS 导入,以提供必要的 JMS 信息,如图 2 所示,此外,在使用底层 WebSphere Messaging 时,如果没有提供目的地,带有 WebSphere ESB 的 WebSphere Process Server 将自动为您创建。我们将在稍后的示例中对此进行介绍。

图 2. JMS 导入绑定
 

如果不提供 JNDI 名称,将根据模块以及导入或导出名称命名目的地,并且在缺省情况下,在 SCA 应用程序总线上创建它。图 3 对此进行了说明。要从 JMS API 访问服务,您必须创建 JMS 目的地和连接工厂,并指向正确的 SIBus 目的地和总线。也可以通过网络指定数据格式;您可以放置序列化 Java 对象或 XML 序列化数据。在大多数集成场景中,XML 是首选的,因为它独立于编程语言。因为带 WebSphere ESB 的 WebSphere Process Server 中的业务对象由 XML 模式定义,所以您可与合作伙伴共享它,这样他们可以使用自已的绑定工具。

图 3. 底层消息传递构件
 

因为 WebSphere Process Server 或 WebSphere ESB 部署提供底层构件的自动配置,所以可用选项卡会提供高级选项,以便您能够提供 SIBus 信息(参阅参考资料,获得关于 WebSphere Application Server SIBus 的详细信息。)在此示例中,我们将提供一个 JMS 导入,它将单向消息从历史模块发送到审核系统。

Web 服务绑定

Web 服务导入允许您使用 SCA 编程模型从 SCA 应用程序调用 Web 服务。与 Web 服务导入连接的组件将请求传递到外部定义的 Web 服务。在 WebSphere Process Server 中,如果您正在使用由 XSD 定义的业务对象,并且外部 WSDL 的 XSD 与之匹配,则参数将被转换。不过,与 XSD 不同,WebSphere Process Server 允许您使用数据映射进行映射。图 4 显示了 Web 服务导入屏幕。

图 4. Web 服务导入



 对于导出,您可以将 SCA 组件公开为 Web 服务。Web 服务导出允许您指定 Port 和 Service。此外,它将生成附加的 WSDL 文档,您可以将其提供给您的 Web 服务客户端。

图 5. Web 服务导出
 

设置示例

要运行此示例,请设置工作区,并加载我们在第 3 部分构建的 SCA 模块,将它们扩展,以便发送 JMS 审核消息,并从 Credit Agency Module 调用外部的 Credit Score Agency:

  1. 在 In WebSphere Integration Developer 中,打开新的工作区,并关闭欢迎使用屏幕。
  2. 从 Business Integration 透视图,右键单击 Business Integration 视图,并选择 Import。

    图 6. 导入 SCA 项目交换
  3. 从向导选择 Project Interchange,并按 Next(图 7)。

    图 7. 选择项目交换
  4. 按 Select All 和 Finish(图 8)。

    图 8. 选择所有项目

    如果检查 Business Integration 视图中的项目,您会发现它们与我们在第 3 部分构建的模块相同。
  5. 展开 CreditApprovalSCAModule(图 9),并打开程序集编辑器。

    图 9. 检查 CreditApproval 模块
  6. 打开时,请注意,CreditApproval 模块与两个 SCA 导入相连。
  7. 还要检查程序集区域中的其他模块。(请参阅第 3 部分,获得关于这些模块的详细信息。)

将 SCA 解决方案与 JMS 应用程序集成

在下面的步骤中,我们将更新 CreditHistory 模块,以便将审核消息写入 JMS 队列。消息的使用者在 Java EE 应用程序中是一个消息驱动的 Bean。此应用程序仅依赖于 IBM Rational? Application Developer 工具。在此示例中,我们假设您在 Rational Application Developer 和 WebSphere Integration Developer 之间有一个共享的 Shell。

导入现有 Java EE 应用程序。请记住,我们将对同一 WebSphere Process Server 测试环境中的所有这些应用程序进行单元测试;不过,Java EE 应用程序可以驻留在常规的 WebSphere Application Server 中(但是,它会限制 XML 的数据类型,因为基本 WebSphere Application Server 没有业务对象框架。)

如果您使用的是带 Rational Application Developer 的 WebSphere Integration Developer,则可能需要启用 Enterprise Java 和 Web Service Development 支持。转到 Preferences 对话框,选择 Workbench => Capabilities,然后选择 Enterprise Java 和 Web Service Development,如图 11 所示。(您不能拥有共享的 WebSphere Integration Developer/Rational Application Developer 工作区)。

图 11. 启用 Java EE 和 Web Service Development 支持
 

打开 J2EE 透视图,并按 OK(图 12)。

图 12. 打开 J2EE 透视图
 

从主文件菜单选择 File => Import。

从导入向导选择 Project Interchange,并按 Next。

按 Select All 和 Finish,如图 13 所示。

图 13. 导入 Java EE 项目交换


 检查 Java EE 应用程序。打开 EJB 项目中的 Deployment Descriptor 编辑器(图 14)。

图 14. Deployment Descriptor 编辑器


 转到 Bean 选项卡,并检查 JMS 绑定(图 15)。我们根据 Java EE 规范对激活规范进行绑定(请参阅参考资料)。(在稍后的步骤中,我们会将目的地名称指定为激活规范配置的一部分。部署描述符中的目的地名称可以用作覆盖机制。)

图 15. 激活规范
 

我们现在将 JMS 导入添加到 CreditHistorySCAModule:

切换回 Business Integration 透视图。从 Business Integration 视图,展开 CreditHistorySCAModule,并双击 SCA Assembly(图 16)。

图 16. 打开 SCA 程序集
 

将 Import 图标拖到程序集(图 17)。

图 17. 拖动导入
 

将导入命名为 JMSAudit,并单击 Add Interface 按钮(图 18)。

图 18. 添加接口
 

从接口向导(图 19)选择 AuditHistory,并按 OK。

图 19. AuditHistory 接口
 

右键单击 JMSAudit 导入,并选择 Generate Binding...=> JMS Binding(图 20)。

图 20. 选择 JMS Binding
 

选择 Text 以指示我们将消息作为文本(而不是序列化 Java 对象)发送。

图 21. 作为文本发送数据
 

在 Properties 视图中检查 JMS 绑定信息。在图 22 所示的 Bindings 部分,您会看到 JMS 信息。保留所有缺省值。

图 22. JMS 绑定
 

要检查 MDB 代码,请展开 ejbModule 文件夹和 ejbs 包,如图 23 所示。

图 23. 打开消息驱动的 Bean
 

在 onMessage 方法(图 24)中,查看如何输出 XML 消息。(您可以在这里添加自已的 JAXB、SDO XML 生成器或其他代码。)

图 24. MDB 代码


 接下来,我们将 CreditHistory 组件连接到 JMS 导入:

将连线从 CreditHistory 组件拖到 JMSAudit 导入(图 25)。

图 25. 将组件连接到 JMS 导入


 在文本框中选择 OK 和 Yes。

选择该引用,并创建一个 Asynchronous invocation 限定符,如图 26 所示。(请参阅第 2 部分和第 3 部分,了解关于限定符的详细信息。)

图 26. 异步调用
 

双击 CreditHistory 组件,打开底层 Java 实现(图 27)。

图 27. 打开 Java 实现
 

从包括的下载材料的 CodeSnippet1.txt 文件中复制代码(如下所示),并在返回值之前,将其添加到 getCreditLimit 方法。

// call the audit service to record the application
ServiceManager sm = new ServiceManager();
System.out.println("************ getting audit history
asynchronous service *********");
AuditHistoryAsync ah = (AuditHistoryAsync) sm.locateService
("AuditHistoryPartner");
System.out.println("************ calling audit history
service *********");
ah.logAuditAsync(creditApp);
System.out.println("************ audit history service
call complete *********");

保存所有的编辑器。

现在我们将配置测试应用程序所需的 JMS 构件:

在 Server 视图中,右键单击 WebSphere Process Server,并选择 Start。

图 28. 启动服务器
 

右键单击并选择 Add and remove projects,然后将 CreditHistorySCAModuleApp 添加到 Configured projects。

图 29. 添加 CreditApprovalSCAModuleApp


 右键单击并选择 Run administrative console(图 30)。

图 30. 运行管理控制台
 

从主菜单选择 Default messaging(图 31)。

图 31. 缺省消息传递
 

选择 Destinations 下方的 JMS queue(图 32)。

图 32. JMS 队列
 

在 Name 字段中输入 JMSAuditQueue,在 JNDI Name 字段中输入 jms/auditQueue。选择与导入匹配的队列名称和 SCA 应用程序总线(图 33)。

图 33. JMS 队列配置


 创建 MDB 要与之绑定的 JMS 激活规范。在缺省消息传递页面上选择 JMS activation specification 链接(图 34)。

图 34. 选择激活规范
 

在 Name 中输入 AuditName,在 JNDI name 中输入 jms/AuditActSpec(这与 EJB 部署描述符中的激活名称匹配)。选择 Queue 作为目的地类型,在队列 JNDI name 中输入 jms/auditQueue,并选择 SCA 应用程序总线。图 35 说明了该设置。

图 35. 激活规范配置
 

保存您的配置(如图 36 所示),并关闭管理控制台。

图 36. 保存配置
 

右键单击服务器,并选择 Add and remove project。我们现在可以部署 JMSAuditTargetEAR,如图 37 所示。

图 37. 将 JMSAuditTargetEAR 添加到服务器
 

测试 JMS 集成的时间:

从程序集编辑器中,右键单击 CreditHistory,并选择 Test Component(图 38)。

图 38. 测试组件
 

在 Configuration 选项卡上,删除 JMSAudit 摸拟器(图 39)。(要了解摸拟器,请参阅此系列文章的以前文章。)

图 39. 删除模拟器
 

切换回 Events 选项卡,输入测试数据,然后按 Continue(图 40)。

图 40. 测试组件
 

选择 WebSphere Process Server v6.0 作为部署位置,并按 Finish(图 41)。

图 41. 选择 WebSphere Process Server
 

返回的结果应与第 3 部分中返回的结果相同(图 42)。

图 42. 结果


 我们仍需验证对客户进行的 JMS 请求,检查 WebSphere 控制台和查找 XML 消息,如图 43 所示。


 调用 Web 服务

我们现在将更新 CreditAgency 模块,以调用外部 Credit Agency Web 服务。已提供基于 Web 服务的 Java EE 1.4。

导入现有 Web 服务:

切换回 J2EE 透视图。导入 WSTargetCreditAGency_PI.zip 项目交换(图 44)。

图 44. 导入 Web 服务
 

从 Project Explorer,您将能够检查 Web 服务(图 45)。

图 45. 检查 Web 服务
 

如果展开 WSTargetCreditAgency Web 项目(图 46),您将找到定义的 WSDL。


 检查 WSDL 文件,确保地址与服务器匹配,如下面的代码片段所示。

<wsdl:service name="TPCreditAgencyImplService">

<wsdl:port binding="impl:TPCreditAgencyImplSoapBinding"
name="TPCreditAgencyImpl">

<wsdlsoap:address
location="http://localhost:9083/WSTargetCreditAgency/services/TPCreditAgencyImpl"/>

</wsdl:port>

</wsdl:service>

通过将其添加到服务器来部署 Web 服务(图 47)。

图 47. 部署 Web 服务
 

对于调用 Web 服务的 SCACreditAgency 模块,我们必须创建一个 SCA Web 服务导入:

切换回 Business Integration 视图,并打开 CreditAgencySCAModule 程序集编辑器(图 48)。

图 48. 打开 CreditAgencySCAModule
 

拖动另一个导入图标(图 49)。

图 49. 放下导入
 

将导入命名为 TPWImport,并按 Add Interface 按钮(图 50)。

图 50. 添加接口
 

选择 TPCCreditAgencyImpl 作为 WSDL 接口(图 51)。

图 51. TPCreditAgecny
 

右键单击导入,并选择 Generate Binding => Web Service Binding(图 52)。

图 52. 生成 Web 服务绑定
 

在 Properties 视图的 Binding 选项卡(带有所选的 Import)中选择 Browse 按钮,如图 53 所示。

图 53. 浏览 Web 服务
 

在 Web 项目中找到 TPCCreditAgencyImpl(图 54)。

图 54. 找到目标 WSDL
 

现在应按照 Binding 部分的描述填充 Port 和 Service,如图 55 所示(端口可以不同)。

图 55. 端口和服务
 

将 CreditAgency 组件连接到 TPWSImport(图 56)。

图 56. 连接 Web 服务导入
 

双击 CreditAgency 组件(图 57)。

图 57. CreditAgency 组件
 

将下面的代码添加到组件。您可以从包括的下载文件的 Snippet2.txt 文件中粘贴代码。

ServiceManager sm = new ServiceManager();
System.out.println("************ creating credit agency service *********");
TPCreditAgencyImpl tpca = (TPCreditAgencyImpl) sm.locateService("TPCreditAgencyImplPartner");
|-------- XML error: The previous line is longer than the max of 90 characters ---------|
System.out.println("************ calling credit approval service via WS import *********");
|-------- XML error: The previous line is longer than the max of 90 characters ---------|
Integer cs = tpca.getTPCreditScore(creditApp.getString("creditId"));
System.out.println("************ credit approval service returned credit score = "
+ cs.toString() + " *********");

return cs;

保存所有编辑器。

我们可以非常容易地测试解决方案:

像对其他模块的操作一样,将 CreditAgency 模块添加到服务器。

右键单击 CreditAgency 组件,并选择 Test Component。

删除 TPWSImport 摸拟器(图 58)。

图 58. 删除 Web 服务摸拟器
 

使用测试值填允数据,并运行测试(图 59)。

图 59. 运行组件测试

检查结果,它应类似于图 60 所示。

图 60. 检查测试结果

查看控制台以验证请求是否通过了 Web 服务。

图 61. 使用管理控制台检查测试结果
 

创建 Web 服务客户端

最后,我们将解决方案公开为 Web 服务。我们通过在 CreditApproval SCA 模块中创建 Web 服务导出来完成此操作:

打开 CreditApprovalSCAModule:

打开 CreditApproval 程序集编辑器(图 62)。

图 62. 打开 CreditApprovalSCAModule
 

将导入拖到程序集(图 63)。

图 63. 拖动导出

将导出命名为 WSCreditRequest,并添加 WSDL 接口。

图 64. WSCreditRequest
 

从接口向导选择 CreditRequest,并按 OK。

按 OK,以生成我们需要的绑定/服务/端口元素(图 65)。

图 65. 生成绑定/服务/端口
 

选择 soap/http,如图 66 所示。

图 66. 选择 soap/http
 

您会注意到,借助于 Web 服务技术,我们已经通过调用 SCA 解决方案所需的信息创建了全新的 WSDL 文件。

图 67. 生成的 WSDL
 

如果检查 WSDL 文件,您会注意到,它实际上导入了 CreditRequest。您的 Web 服务客户端会需要二者。另外,确保您的主机和端口与测试服务器匹配。

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions name="WSCreditRequest_CreditRequestHttp_Service"
targetNamespace="http://CreditApproval/CreditRequest/Binding2"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:Port_0="http://CreditApproval/CreditRequest"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:this="http://CreditApproval/CreditRequest/Binding2"
xmlns="http://schemas.xmlsoap.org/wsdl/">
<wsdl:import namespace="http://CreditApproval/CreditRequest"
location="CreditRequest.wsdl"/>
<wsdl:binding name="WSCreditRequest_CreditRequestHttpBinding"
type="Port_0:CreditRequest">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="calulateCreditScore">
<soap:operation/>
<wsdl:input name="calulateCreditScoreRequest">
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output name="calulateCreditScoreResponse">
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="WSCreditRequest_CreditRequestHttpService">
<wsdl:port name="WSCreditRequest_CreditRequestHttpPort"
binding="this:WSCreditRequest_CreditRequestHttpBinding">
<soap:address
location="http://localhost:9083/CreditApprovalSCAModuleWeb/sca/WSCreditRequest"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>

在接下来的步骤中,我们将使用 Rational Application Developer 的 Web 服务客户端向导工具来生成 Java EE Web 服务客户端,但是向导必须找到 CreditRequest WSDL 和新生成的 WSDL 才能运行。执行此操作最简单的方法是将 WSDL 复制或移动到 CreditApprovalLibrary。这样还会提供共享库中接口的一致性。

图 68. 将 WSDL 移动到库
 

保存程序集编辑器。

部署 CreditApprovalSCAModule(图 69)。

图 69. 部署 CreditApproval 模块
 

使用 Rational Application Developer Web 服务向导工具创建一个 Java EE Web 服务客户端示例:

切换至 J2EE 透视图,然后从主菜单选择 File => New => Dynamic Web Project。

图 70. 创建新的动态项目
 

将 Web 项目命名为 WSClientCreditApproval,并按 Finish。这样会创建一个新的动态 Web 项目和相应的 EAR 项目。

再次从主菜单选择 File => New。此时,选择 Web Services => Web Service Client(图 71),然后按 Next。

图 71. Web 服务客户端
 

浏览 CreditApprovalLibrary 项目,并选择 WSCreditRequest_CreditRequestHttp_Service.wsdl(图 72)。

图 72. 选择 WSDL
 

选择 Web for client type,并选择新创建的 Web 项目(图 73)。

图 73. Web 客户端
 

在向导的最后一页,请选择使用示例 JSP 页面测试生成的代理,并按 Finish(图 74)。确保选择了 calculateCreditScore 和 getCreditRequest 方法。

图 74. 生成 Web 页面
 

应用程序应在浏览器中自动部署并启动 Web 页面。选择 CalculateCreditScoremethod,输入一些测试数据,并测试整个解决方案。

图 75. 测试应程序并查看结果
 

结束语

本文为您介绍了如何使用 JMS 和 Web 服务将 SCA 解决方案与各种类型的系统集成在一起。具体来说,我们演示了将导入和导出绑定到 JMS 和 Web 服务的操作步骤。SCA 规范是以定义集成为目标的编程模型,并且应该使用经验证的技术(如 JMS 和 Web 服务)。值得注意的是,WebSphere Process Server 和 WebSphere ESB 的 SCA 版是 SCA 公共规范的最早版本,其中,导入已重命名为外部服务,导出已重命名为入口点。

在此系列文章的最后一部分中,我们将向您介绍如何通过 BPEL 使用更复杂的交互。

 

组织简介 | 联系我们 |   Copyright 2002 ®  UML软件工程组织 京ICP备10020922号

京公海网安备110108001071号