使用 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:
- 在 In WebSphere Integration Developer 中,打开新的工作区,并关闭欢迎使用屏幕。
- 从 Business Integration 透视图,右键单击 Business Integration
视图,并选择 Import。
图 6. 导入 SCA 项目交换
- 从向导选择 Project Interchange,并按 Next(图 7)。
图 7. 选择项目交换
- 按 Select All 和 Finish(图 8)。
图 8. 选择所有项目
如果检查 Business Integration 视图中的项目,您会发现它们与我们在第 3 部分构建的模块相同。
- 展开 CreditApprovalSCAModule(图 9),并打开程序集编辑器。
图 9. 检查 CreditApproval 模块
- 打开时,请注意,CreditApproval 模块与两个 SCA 导入相连。
- 还要检查程序集区域中的其他模块。(请参阅第 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 使用更复杂的交互。 |