级别: 中级 Benedict Fernandes (bxf@us.ibm.com), 高级管理顾问, IBM José De Jesús (jdejesus@us.ibm.com), IBM 认证 IT 架构师,IBM 全球客户团队, IBM
2008 年 3 月 24 日 WebSphere Integration Developer V6.0.2 中的 MQ 绑定功能简化了 SCA 和 MQ 应用程序之间的互操作性,并使得从 SCA 应用程序中读取本机 MQ 消息和向其写入消息变得更加容易。
引言
一般情况下,开发服务组件体系结构 (SCA) 应用程序是为了从功能上集成现有的企业资源。许多现有的旧式应用程序都基于消息传递技术,如 IBM® WebSphere® MQ。WebSphere Integration Developer V6.0.2 中引入的 MQ 绑定功能简化了 SCA 和 MQ 应用程序之间的互操作性,并使得从 SCA 应用程序中读取本机 MQ 消息和向其写入消息变得更加容易。本文首先介绍了 MQ 绑定,然后向您介绍了如何基于 SCA 和 MQ 旧式应用程序创建一个端到端的解决方案。
基本概念
SCA 应用程序驻留在类似于 WebSphere Integration Developer 容器的抽象容器中,称为 SCA 模块,一般包含业务对象 (BO)、接口、导出和导入:
-
业务对象是用户定义的数据类型,在内部表示为服务数据对象 (SDO) 格式的 XML。
-
接口表示客户端契约并指定到服务的输入和从服务的输出。
-
导出和导入是 SCA 抽象,它使 SCA 应用程序能够与外部世界互操作。
要使 SCA 组件通过消息队列与基于消息的应用程序通信,其导出和导入必须配置了 SCA 消息传递绑定。SCA 支持三种类型的消息传递绑定:
-
Java Messaging Service (JMS) 绑定——一般由纯 JMS 客户端使用,如使用 WebSphere 缺省消息传递提供程序的客户端。
-
MQ JMS 绑定——一般由 JMS 客户端使用,这些客户端将 WebSphere MQ 用作基础消息传递提供程序。
-
MQ 绑定——一般由纯 MQ 客户端使用,也称为旧式 MQ 客户端。
本文重点向您介绍如何使用 MQ 绑定。
当您想从 WebSphere MQ 消息传递客户端以异步方式访问您的组件时,需要使用导出 - MQ 绑定。当您想从一个组件访问 WebSphere MQ 消息传递提供程序时,需要使用导入 - MQ 绑定。
数据绑定 是另外一个重要术语。数据绑定类的主要功能是桥接以某种方式与输入或输出消息的模式对应的数据格式。在本例中,我们的数据绑定类将转换从消息传递系统以本机格式传递到 SCA 应用程序中服务数据对象 (SDO) 的数据,对于响应消息适用相反过程。数据绑定类实现一个预定义的接口,并在 SCA 应用程序边界作为“导出”或“导入”的一部分进行配置。一般情况下,它还实例化和填充业务对象。WebSphere Integration Developer 和 WebSphere Process Server 目前仅支持 Java 作为数据绑定类的实现语言。
端到端的应用程序场景
图 1
- MQ 消息传递客户端将消息放在 MQ 本地队列 EXPORTQ 中。RFHUTIL 实用工具既用作消息的生产者又用作消息的使用者。
- 消息到达 EXPORTQ 中将导致配置了 MQ 消息绑定的 SCA 导出使用该消息并调用 BPEL 进程。
- 数据绑定类将读取本机 MQ 消息,解析该消息并填充以前使用该数据定义的类型的业务对象。
- 作为其处理的一部分,BPEL 将调用基于异步 MQ 的服务。
- 配置了 MQ 消息绑定的 SCA 导入会将业务对象序列化为 XML 字符串,并且将它放到称为 IMPORTQ 的本地 MQ 队列中。
- 在此情况下,使用 MQ 应用程序 RFHUTIL 然后可以使用该消息。
数据
此示例使用一个固定长度为 70 字节的纯文本消息,且具有以下结构:
图 2
了解您正在使用的本机数据格式非常重要,这样可以在您确定如何在应用程序中分配工作时做出正确的体系结构决策。例如,在原始数据进入代码的 BPEL 部分(而不是在数据绑定类)后,您的应用程序可能需要解析该数据。
以下部分将向您介绍实现上述场景时所需的详细步骤。为了帮助您更好地理解任务的总体结构和顺序,下面列出了涉及到的步骤:
- 创建 WebSphere MQ 资源:队列管理器和队列
- 创建 WebSphere MQ 队列管理器
- 创建 WebSphere MQ 队列
- 创建基于 WebSphere Process Server 的业务应用程序——实现 BPEL 业务逻辑
- 创建 BI 模块(所有 SCA 构件的容器)
- 创建业务对象
- 创建服务接口
- 创建 BPEL 流程
- 创建与消息传递相关的 SCA 构件:导出、导入、数据绑定
- 创建数据绑定类
- 创建 SCA 消息传递导出
- 创建 SCA 消息传递导入
- 端到端测试应用程序
- 使用 RFHUtil 发送和监视消息
创建 WebSphere MQ 资源
此示例所需的 MQ 资源包括 MQ 队列管理器(名为 QMGR900)及其在端口 1490 上配置的侦听器端口,两个 MQ 本地队列(名为 EXPORTQ 和 IMPORTQ)。使用 WebSphere MQ Explorer 实用工具来创建所需的 MQ 资源。在创建了 EXPORTQ 和 IMPORTQ 本地队列后,WebSphere MQ Explorer 的视图应如下所示:
图 3
如果需要有关创建 MQ 资源的详细说明,请参阅文件 <download_root>/MQBindings/docs/MQResourcesSetup.doc,您可以从下面下载本文件。
创建基于 WebSphere Process Server BPEL 的应用程序
从 Business Integration 透视图,创建一个新模块以承载此应用程序所需的构件。要切换到 Business Integration 透视图,请选择 Window => Open Perspective => Business Integration。在 Business Integration 视图中,右键单击画布,然后选择 New => Module。在 New Module 面板中的 Module Name 字段中输入 MQBindings,然后单击 Finish。
在 Business Integration 透视图中,展开 MQBindings,右键单击 Data Types,然后选择 New => Business Object。如下所示,在 /com/ibm/issw 文件夹中创建 ProcessBO 业务对象,然后单击 Finish:
图 4
这将打开业务对象编辑器。单击 Add Attribute 以创建单个 String 属性,即 orderString:
图 5
本字段将包含作为固定长度字符串的整个本机 WebSphere MQ 传入消息。传入消息可以具有不同的格式。单击 Ctrl+S 进行保存。
像创建上面的 ProcessBO 业务对象那样,重复上述步骤,在同一 /com/ibm/issw 文件夹中创建另一个名为 ServiceXBO 的业务对象。以下是 ServiceXBO 所需的属性:
图 6
单击 Ctrl+S 进行保存。现在已创建了该业务对象,下面可以创建将由 BPEL 流程使用的服务接口了。在导航树中,展开 MQBindings => New => Interfaces。右键单击 Interfaces 以启动 New Interface 面板。如下所示,输入接口名称及其各自的文件夹/数据包,然后单击 Finish:
图 7
在 Interface Editor 中,添加一个名为 processOrder 的单向操作。将该字段名修改为 orderInput,然后,如下所示将其关联类型选为 ProcessBO。单击 Ctrl+S 进行保存:
图 8
用类似于上一步骤中的方法在 com/ibm/issw 文件夹中创建一个名为 ServiceXInterface 的新服务接口。在接口编辑器中,添加一个名为 updateInventory 的单向操作。将该字段名修改为 orderInput,然后将其关联类型选为 ServiceXBO。单击 Ctrl+S 进行保存:
图 9
现在您可以创建一个处理传入消息并将其放入传出队列的 BPEL 流程。从 Business Integration 透视图中,创建一个新的业务流程:展开 MQBindings => Business Logic,右键单击 Process,然后选择 New => Business Process。
如下所示,在 com/ibm/issw 文件夹中创建一个名为 OrderProcess 的新 BPEL 流程,然后单击 Next:
图 10
单击 Select an existing Interface,然后单击 Browse 以搜索并选择 OrderProcessInterface。这将自动选择 processOrder 操作。单击 Finish。
在业务流程编辑器中,添加一个 Java 代码段:选择 Snippet 活动并将缺省的 Java 代码段名更改为 Log Input。在 Properties 视图中,单击 Details 选项卡,然后选择 Java 作为实现类型。当 Question 对话框出现时,单击 Yes。在文本区域中,输入以下代码行:
System.out.println("The Input Order Record is ==> " + OrderInput); |
最后得到的 BPEL 应该如下所示:
图 11
与上述步骤一样,添加另外一个 Java 代码段节点,并将其名称更改为 Prepare Service Call。从提供的文本文件中剪切并粘贴此 Java 代码段的代码:<download_root>/MQBindings/code/PrepareServiceCallX-codeSnippet.txt。
要处理出现的编译错误,在 Snippet 窗口内右键单击,然后选择 Source => Organize Imports。要解决编译错误,请选择以下数据包:commonj.sdo.DataObject、com.ibm.websphere.sca.sdo.DataFactory。
此代码段使用临时变量 ServiceXBO,该变量用来存储调用 ServiceX 的输入。该代码段使用基本的 Java 字符串处理技术从原始传入消息中提取相关数据,然后填充特定于 ServiceX 的 BO:
图 12
若要解决其余的编译错误,请创建 theServiceXBO 临时变量并将其与适当的数据类型关联。在 BPEL 编辑器的大纲视图中,单击 Variables 部分中的 + 号并将该变量命名为 theServiceXBO:
图 13
在 Properties 视图中,确保 theServiceXBO 显示为关联的数据类型。最后得到的 BPEL 应该如下所示:
图 14
接下来,将一个 Invoke 活动添加到 BPEL 流程中,为清楚起见,将其重命名为 Invoke ServiceX。必须配置该 Invoke 活动以调用或呼叫服务。必须配置各自的调用服务接口(也称为 Reference Partner)。为此,将 ServiceXInterface 从 Navigation 视图拖放到 BPEL 流程编辑器画布中:
图 15
上述拖放操作的结果应将 ServiceXInterface 添加到了 Reference Partners 部分下。
在 Properties 视图中,选择 Details 选择卡,然后单击 Browse 并选择 ServiceXInterface。确保将 updateInventory 选择为请求的操作。选中 Use Data Type Variables 复选框,然后选择临时变量 theServiceXBO。最后得到的配置应该如下所示:
图 16
在 BPEL 流程创建中,最后一步是添加一个简单的 Java 代码段节点以记录退出消息。将其重命名为 Log Final。在选择了 Log Final 节点后,输入以下 Java 代码:
System.out.println("Exiting OrderProcess Done -- BYE"); |
最终的 BPEL 流程应该如下所示:
图 17
创建与消息传递相关的 SCA 构件
若要创建数据绑定类,请切换到 Java 透视图:选择 Window => Open Perspective => Other => Java => OK。在 Package Explorer 视图中,右键单击 com.ibm.issw,然后选择 New => Class。通过输入以下数据绑定类名称填写 New Java Class 面板:InventoryCustomDataBinding。然后单击 Finish。
在前面的类创建步骤中,您已经标识出此类用于实现 MQBodyDataBinding 类。但是,为了简单起见,提供了一个包含完整的 MQ数据绑定类实现的单独源文件。在文本编辑器中打开文本文件 <download_root>/code/InventoryCustomDataBinding.java,使用提供的 Java 实现替换您的工作区中的框架实现。在 MQBodyDataBinding 类上指定的方法应该出现在大纲视图中。检查导入列表以了解是否使用了基础 WebSphere Process Server 包。单击 Ctrl+S 进行保存。
图 18
切换回 Business Integration 透视图,然后在 Navigation 视图中选择 MQBindings => Business Logic => Process => OrderProcess。如下所示,将 OrderProcess 组件拖放到画布中:
图 19
选择 OrderProcess 组件,右键单击 Generate Export => Messaging Binding => MQ Binding。
通过 MQ Export Binding 面板,配置新生成的 MQ 导出。有两类主要配置信息是必需的:WebSphere MQ 配置信息和数据绑定类规范。WebSphere MQ 信息(如队列管理器名称、主机、通道和端口)必须与以前配置的队列管理器设置相对应。在生产环境中,此信息应从 WebSphere MQ 管理员那里获取。在此示例中,由于它是一个单向通信流,因此,您只需指定 Receive Destination Queue。内部 SCA MDB 将在该队列上进行侦听,然后,在调用可选配置数据绑定类之后将消息提供给关联的 SCA 组件。
作为配置 MQ 导出的最后一步,必须填充数据转换部分的属性。从下拉菜单中,将 Request SerializationType 的值设置为 User Supplied。然后单击 Browse并选择 InventoryCustomBinding 类。最终的配置应该如下所示:
图 20
单击 OK 以完成 MQ 导出的配置。新创建的 MQ 导出将出现在组装图中。将 MQ 导出重命名为 OrderProcessExport:
图 21
您还记得,SCA 导出和导入是 SCA 应用程序的外部访问点。在前面的步骤中,您使用 MQ 消息传递绑定配置了 SCA 导出,从而使应用程序能够从基于 MQ 的消息传递客户端接收消息(入站)。现在需要配置出站通信路径,以使 SCA 应用程序能够将异步消息发送到基于 MQ 的消息传递客户端。
在图标面板中,选择 Import,然后将其拖到画布中,并将其重命名为 ServiceXImport。选择 ServiceXImport 后,单击出现在其上方的接口图标以添加新接口。从 Add Interface 面板中,选择 ServiceXInterface。您还记得,ServiceXInterface 是在开始时定义业务对象之后配置的。单击 OK。右键单击 ServiceXImport 组件,然后选择 Generate Binding => Messaging Binding => MQ Binding。
配置 MQ 导入类似于配置 MQ 导出,具体有两大主要任务:配置特定于 MQ 传输的信息,指定特定于数据转换的信息。
如下所示,输入 MQ 导入的属性。在此示例中,只需序列化业务对象并将其发送到配置的输出队列,本例中为 IMPORTQ。因此,选择 Serialized as XML 作为所需的 Request Serialization type,然后在完成时单击 OK:
图 22
在 Assembly Diagram 选项卡中,从 OrderProcess 组件中选择线路,并将其连接到 ServiceXImport。现在应显示组装图的最终版本及其所有连接的组件:
图 23
端到端测试应用程序
现在可以将应用程序部署到 WebSphere Process Server 中了。在 Servers 选项卡上,右键单击 WebSphere Process Server V6,然后选择 Add and remove projects。要部署应用程序,请单击 MQBindingsApp,然后选择 Add => Finish,等待服务器状态更改为 Started。与平时一样,监视服务器控制台以了解是否有任何潜在的启动错误。现在已准备就绪,可以测试应用程序了。
要启动此测试流程,请使用前面创建的 MQ 资源。您将使用 RFHUTIL 实用程序从文本文件中读取文件,并将数据作为消息发送给由队列管理器 QMGR900 管理的 EXPORTQ 本地队列。消息到达 EXPORTQ 队列后将激活 BPEL 流程来使用该消息。在其执行过程中,BPEL 流程将调用一个异步服务,方法是将另一消息放在名为 IMPORTQ 的 MQ 出站队列。
启动 RFHUTIL 实用程序。如下面的步骤 1 和步骤 2 中所示,指向队列管理器 QMGR900 和 EXPORTQ 队列。然后单击 Read File,接着指向将本文提供的 data.txt 文件解压缩到的目录。单击 Write Q 以将该消息提供给 EXPORTQ:
图 24
您还可以通过查看 RFHUTIL 屏幕的 Data 选项卡上的内容来检查该数据。正如前面所解释的那样,将消息放在 EXPORTQ 队列上会导致 BPEL 流程使用和转换该消息并将其提供给 IMPORTQ 队列。每在 EXPORTQ 队列上放一条消息,IMPORTQ 队列上的消息数应增加一个。要检查 IMPORTQ 和 EXPORTQ 的队列深度,请使用 WebSphere MQ Explorer:单击 Start => WebSphere MQ => WebSphere MQ Explorer,然后按如下所示检查 Current queue length 字段。您还可以通过查看 RFHUTIL 屏幕的 Data 选项卡上的内容和查看 IMPORTQ 上序列化的 XML 数据消息来检查该数据。
图 25
可以按如下所示,使用 RFHUTIL 实用工具检查 IMPORTQ 上的消息内容。确保将 QMGR900 选为队列管理器,将 IMPORTQ 选为当前队列。单击 Read Q 以读取队列中的消息。这将导致从 IMPORTQ 中物理删除该消息。
图 26
要检查消息的实际内容,请选择 Data 选项卡,然后选择 XML 按钮,由于 SCA 导入配置了 Serialize as XML 选项,所以会导致消息输出作为 XML 传输到目标队列。
图 27
结束语
本文首先介绍了 WebSphere Integration Developer V6.0.2 MQ 绑定功能的基本概念,然后介绍了支持SCA 和 MQ 应用程序之间集成所需的实现步骤和构件。
致谢
作者感谢 Peter Xu、Debasish Banerjee 和 Robert Drelles,他们为本文提供了宝贵的反馈意见。
下载 | 描述 | 名字 | 大小 | 下载方法 |
|---|
| Code sample | MQBindingsArticleArtifacts.zip | 234 KB | HTTP |
|---|
参考资料
作者简介  | |  |
Benedict Fernandes 是位于北卡罗来纳州 Research Triangle Park 中的 IBM Software Services for WebSphere 的一名高级管理顾问。他拥有卡内基梅隆大学信息网络专业的硕士学位、德拉萨大学的计算机科学硕士学位,并且是印度 BITS-Pilani 学院的一名理学硕士。您可以通过 bxf@us.ibm.com 与 Benedict 联系。 |
 | |  |
José De Jesús 是位于佛罗里达州 Boca Raton 中的 IBM 全球客户团队的 IBM 认证 IT 架构师。他拥有纽约福特汉姆大学的学士学位,并且拥有佛罗里达州的迈阿密大学技术管理专业的 MBA 学位。您可通过 jdejesus@us.ibm.com与 José 联系。 |
对本文的评价
|