|
Joshy Joseph, 软件工程师, IBM
Douglas Griswold, I/T 专家, IBM
2005 年 6 月 24 日
学习如何生成服务请求者端构件并将它们与业务流程执行语言(Business Process Execution Language,BPEL)集成在一起。Joshy Joseph 和 Douglas Griswold 提供了循序渐进 (step-by-step) 的方法来开发服务请求者端构件,这些构件是使用用于 CICS 的简单对象访问协议(Simple Object Access Protocol,SOAP)特性(由 CICS Transaction Server (TS) Version 2.3 提供)从工作流过程中调用遗留客户信息控制系统(Customer Information Control System(R),CICS)业务逻辑所需要的。
引言
在随需应变的业务中,企业级应用程序需要与企业内部和外部的其他应用程序所提供的服务集成在一起。在本文中,我们举例说明了如何使用新的用于 CICS 的 SOAP 特性(由 CICS TS 提供)来将遗留应用程序与在 IBM® WebSphere® Business Integration Server Foundation 中运行的业务流程集成在一起。
在本系列的第 10 部分中,我们展示了如何在 CICS TS 中创建用于从 XML 到 COMMAREA 转换的消息适配器和其他服务提供者端构件。在本文中,我们举例说明了如何创建服务请求者端构件,并且介绍了集成遗留服务与 BPEL 工作流过程所需的循序渐进方法。
服务请求者端的改变
我们使用 WebSphere Studio Application Developer Integration Edition 和 WebSphere Studio Enterprise Developer (Enterprise Developer) 工具生成请求者端构件,这些构件是集成支持 CICS SOAP 的事务提供的服务所需要的。我们使用 WebSphere Studio Application Developer Integration Edition 开发工作流构件,使用 Enterprise Developer 将 COBOL Copybook 转换成 XML Schema 元素。有关 WebSphere Studio Application Developer Integration Edition 和 Enterprise Developer 的更多信息,请参阅参考资料。
Web 服务使用者/客户机使用 Web 服务描述语言(Web Services Description Language,WSDL)文件来描述由 CICS 服务器公开的服务和客户机与服务之间交换的数据的定义。
您可以使用 Enterprise Developer 来执行下列步骤:
- 从 COBOL Copybook 创建 XML Schema 文件,COBOL Copybook 表示输入和输出业务逻辑程序 COMMAREA (请参见侧栏 Enterprise Developer 工具生成的 COMMAREA XML Schema 的局限性)。
- 为 CICS 服务器公开的服务生成 WSDL 文件,其中包括上一步创建的 XML Schema 元素。
请注意,在自上而下的方法中,除了 Enterprise Developer 之外,您还可以使用 IBM WebSphere Business Integration Server Foundation 构建 WSDL 文件来表示由支持 CICS SOAP 的事务所提供的服务。
清单 1 显示了表示 CICS 订单验证程序的 WSDL 文件。
清单 1. WSDL 文件
<wsdl:definitions name="CoatsCicsServices"
targetNamespace=http://tempuri.org/CoatsCicsServices/
xmlns:tns="http://tempuri.org/CoatsCicsServices/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsd1="http://www.coats.com/schemas/ValidateOrderIInterface"
xmlns:xsd2="http://www.coats.com/schemas/ValidateOrderOInterface">
<wsdl:types>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:import namespace="http://www.coats.com/schemas/ValidateOrderOInterface"
schemaLocation="../www/schemas/ValidateOrderOInterface/ValidateOrderResponse.xsd">
</xsd:import>
<xsd:import namespace="http://www.coats.com/schemas/ValidateOrderIInterface"
schemaLocation="../www/schemas/ValidateOrderIInterface/ValidateOrderRequest.xsd">
</xsd:import>
</xsd:schema>
</wsdl:types>
<wsdl:message name="ValidateOrderIMessage">
<wsdl:part name="ValidateOrderRequest" type="xsd1:ValidateOrderRequest">
</wsdl:part>
</wsdl:message>
<wsdl:message name="ValidateOrderOMessage">
<wsdl:part name="ValidateOrderResponse" type="xsd2:ValidateOrderResponse">
</wsdl:part>
</wsdl:message>
<wsdl:portType name="ValidateOrderPortType">
<wsdl:operation name="ValidateOrderOperation">
<wsdl:input message="tns:ValidateOrderIMessage"
name="ValidateOrderOperationInput">
</wsdl:input>
<wsdl:output message="tns:ValidateOrderOMessage"
name="ValidateOrderOperationOutput">
</wsdl:output>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="CoatsSOAPBinding" type="tns:ValidateOrderPortType">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" />
<wsdl:operation name="ValidateOrderOperation">
<soap:operation
soapAction="http://tempuri.org/CoatsCicsServices/ValidateOrderOperation" />
<wsdl:input name="ValidateOrderOperationInput">
<soap:body use="literal" parts="ValidateOrderRequest"/>
</wsdl:input>
<wsdl:output name="ValidateOrderOperationOutput">
<soap:body use="literal" parts="ValidateOrderResponse"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="CoatsSOAPService">
<wsdl:port name="CoatsSOAPServicePort" binding="tns:CoatsSOAPBinding">
<soap:address
location="http://cics.server.host:5432/CICS/XWBA/DFHWSDSH/ORDVLDT" />
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
|
下面几节举例说明了将该 WSDL 文件(清单 1)表示的 CICS 服务与工作流集成在一起所需的步骤。WebSphere Studio Application Developer Integration Edition Version 5.1.1 用于开发 WebSphere Process Choreographer BPEL 工作流。主要步骤包括:
- 建立包含 CICS 服务 WSDL 和 XML Schema 文件的 WebSphere Studio Application Developer Integration Edition 工作区。
- 从 WSDL 创建客户端代理。
- 为客户机代理创建包装器服务实现、WSDL 和绑定。
- 创建调用 CICS 服务的业务流程工作流。
- 生成 BPEL 部署代码。
步骤 1. 建立包含 CICS 服务 WSDL 和 XML Schema 文件的 WebSphere Studio Application Developer Integration Edition 工作区
如果 WSDL 不是在步骤 1 中创建,则导入它。您也需要导入 WSDL 文件所引用的 XML Schema 文件来指定请求和响应消息格式。
如清单 1 所示,在 WSDL 文件中指定的服务端口地址为: location=http://cics.server.host:5432/CICS/XWBA/DFHWSDSH/ORDVLDT。您的 CICS 主机位于 cics.server.host,正在端口 5432 上侦听传入 HTTP 请求。指定的 CICS 区域是 XWBA,消息适配器程序称为 ORDVLDT。这是一个虚构的 URL,因此下面的应用程序示例只是演示一项技术,并不打算产生一个可以运行的 CICS 服务。
图 1 展示了为其输入和输出创建或导入 CICS 服务 WSDL 文件和 XML Schema 之后的工作区。XML Schema 包名反映了由 WSDL 名称空间的类型所指定的名称。正如在本系列的第 10 部分中所提到的,这些名称空间声明是将请求/响应映射到用来编组/解组 XML 到本地运行时类的正确代理代码所必需的。
图 1. 包含 CICS 服务 WSDL 和 XML Schema 文件的 WebSphere Studio Application Developer Integration Edition 工作区

|
Enterprise Developer 工具生成的 COMMAREA XML Schema 的局限性
我们在本系列的第 10 部分中开发的 CICS 服务端 COBOL XML 请求消息解析器基于 SAX (非验证的),并且将响应消息构建成文本字符串(同样也没有 XML 验证)。除了这个问题之外,当使用 Enterprise Developer 从 COBOL COMMAREA 生成 XML Schema 时,COMMAREA 结构中包含的任何数组出现的次数都必须最多。例如,您的订单验证结果响应 COMMAREA 结构指定了 100 个返回元素: 03 VALIDATION-RESULTS-ARRAY OCCURS 100 TIMES.。为这个元素生成的 XML Schema 指定 minOccurs="100" maxOccurs="100"。
虽然 CICS 服务端是非验证的,但是 WebSphere 客户机代理根据该 Schema 进行验证。在上面的例子中,您应该总是有 100 个查找结果。这大概并不是想要的行为。
为了消除这些局限性,您可以使用 Enterprise Developer 来生成将作为起点或模板的 XML Schema。此外,您还可以做如下的修改:
- 调整数组的 minOccurs/maxOccurs 值以反映消息适配器中支持的范围。
- 实现其他数据完整性限制支持的 XML Schema,例如枚举列表。
- 给 XML 元素提供更有意义的名称,而不使用自动生成的 COMMAREA 名称。
|
步骤 2. 创建客户机代理
通过建立和调用 SOAP CICS Web 服务,可以将 WebSphere Application Server Enterprise Process Choreographer 工作流用作 Web 服务客户机/使用者。它还将返回的结果用于随后的工作流活动。在 WebSphere Studio Application Developer Integration Edition 中,Web 服务客户机代码可以从 WSDL 文件自动生成。要完成这一步,请右键单击 WSDL file 并选择 Enterprise Services-Generate Service Proxy。这个选项将启动一个向导,如图 2 所示。对于示例场景,您需要选择 Web Services Invocation Framework (WSIF) 代理类型。
图 2. 代理选择向导

这个选项显示了另一个对话框,如图 3 所示。您需要确保选择 Generate helper classes。这将生成编组和解组用于 CICS SOAP 请求和响应的 SOAP XML 所需的 Java™ 类。同样地,为生成的代理类选择包名。
图 3. 生成服务代理向导

单击 Next 显示另一个对话框,如图 4 所示。选择 Client stub 代理类型,并选择将从工作流中访问的 WSDL operations。单击 Finish。
图 4. 服务操作选择向导

图 5 显示了最新生成的 Web 服务代理文件。在生成代理之前,只有突出显示的 WSDL 和 XML Schema 存在。在生成代理之后,代理和助手类就都创建好了。
图 5. 生成客户机代理之后的 WebSphere Studio Application Developer Integration Edition 工作区

步骤 3. 为客户机代理创建包装器服务、WSDL 和服务绑定
创建一个具有每个 WSDL 操作的方法的新 Java 类。在本例中,您将只有一个方法。在上一步中生成的助手类用于映射 XML 和 Java 之间的数据元素。图 6 显示了请求消息的这种映射的视图。响应消息也以类似的方式映射。
图 6. 请求 XML Schema 元素到 Java 助手类的映射

包装器 Web 服务客户机的实现代码使用与 XML Schema 相对应的 Java 类来构建 SOAP CICS 请求。
清单 2 显示了构建 SOAP 消息的 Java 类以及调用代理来调用 CICS 服务的示例代码。您有一个方法 ValidateOrder,它与您选择的 WSDL 操作相对应。您从最里面的元素开始构建请求 XML 文档,一直到根元素为止。您同样也使用生成的助手类来处理响应。如清单 2 所示,响应消息按相反的方式处理。这里,您从根 XML 元素开始,一直到遍历它所包含的元素为止。
清单 2. 服务包装器
public class COATSAccess {
public void ValidateOrder(String requestType) {
// set up CICS SOAP request
ValidateOrderPortTypeProxy aProxy = new ValidateOrderPortTypeProxy();
FeatureList.FeatureListItemElementLocal featureListElement1 = new
FeatureList.FeatureListItemElementLocal();
featureListElement1.setFeatureCode("Storage");
featureListElement1.setQuantity(2);
FeatureList featureList = new FeatureList();
featureList.setFeatureListItem(0, featureListElement1);
FeatureList.FeatureListItemElementLocal featureListElement2 = new
FeatureList.FeatureListItemElementLocal();
featureListElement2.setFeatureCode("Memory");
featureListElement2.setQuantity(6);
featureList.setFeatureListItem(1, featureListElement2);
ValidateOrderRequest validateOrderRequest = new ValidateOrderRequest();
validateOrderRequest.setOrderNumber("1234567");
validateOrderRequest.setType("Online");
validateOrderRequest.setFeatList(featureList);
// call the CICS SOAP web service
ValidateOrderResponse validateOrderResponse =
aProxy.ValidateOrderOperation(validateOrderRequest);
// process CICS SOAP response
OrderMessages orderResponse = validateOrderResponse.getMessages();
OrderMessageElementLocal[] orderMessages = orderResponse.getOrderMessage();
System.out.println("CICS Web Service SOAP Response: " +
"Return Code:" + validateOrderResponse.getReturnCode() );
for (int i = 0; i < orderMessages.length; i++) {
System.out.println("Message Prefix: " + orderMessages[i].getMessagePrefix() +
", Text: " + orderMessages[i].getMessageText());
}
}
}
|
现在从这个 Java 类生成服务 WSDL。右键单击 wrapper class 并选择 New-Service Built From 工具选项。选择正确的选项并为公开的服务方法生成 WSDL,如图 7 所示。
图 7. 新的 Java 服务

这创建了一个 COATSAccessJavaService.wsdl 文件。现在,您需要从该 WSDL 生成绑定文件和部署文件。右键单击这个 WSDL file 并选择 Enterprise Services-Generate Deploy Code。如图 8 所示,选择 SOAP 作为入站绑定并单击 Finish。
图 8. 生成部署代码

步骤 4. 创建调用 CICS 服务的业务流程工作流
这一节将举例说明如何创建一个简单的业务流程来调用在步骤 3 中创建的 CICS 服务包装器。该服务包装器接着使用在步骤 2 中创建的 SOAP 客户代理来调用 CICS 服务。
从 WebSphere Studio Application Developer Integration Edition 工作台中选择 File > New > Business Process。图 9 显示了为新的 BPEL 流程提供名称和包的对话框。
图 9. 新的业务流程

如图 10 所示,选择 Sequence-based BPEL 并单击 Finish。这将生成 BPEL 并在 WebSphere Studio Application Developer Integration Edition 中打开 BPEL 编辑器。
图 10. 流程类型

如图 11 所示,插入一个新的名为 ValidateOrder 的合作伙伴链接。在 Implementation 选项卡上,单击 Partner Link Type 旁边的 New。
图 11. 插入 PartnerLink

这个选项显示了一个对话框,如图 12 所示。选择 One Role。将该角色命名为“validate”,然后单击 Browse。定位服务包装器 WSDL 文件 (COATSAccess.wsdl) 并单击 OK。
图 12. 新的 PartnerLink

如图 13 所示,创建两个流程变量——一个用于服务调用的输入 (ValidateIn),一个用于输出 (ValidateOut)。
图 13. 创建新的变量

单击“ValidateIn”变量,然后单击 Message 选项卡上 File 右边的 Browse。定位包装器服务的 WSDL,然后选择输入请求,如图 14 所示。
图 14. 从 WSDL 中选择消息

对于 ValidateOut 遵循同样的流程,并将其指向 WSDL 文件中的“ValidateOrderResponse”部分。
现在,在“Receive”和“Reply”活动之间添加一个调用活动来从流程中调用 CICS 服务。将新的 InvokeOrderValidation 活动连接到上面创建的合作伙伴链接和操作以及输入和输出流程变量,如图 15 所示。
图 15. 调用订单验证服务

步骤 5. 创建 BPEL 部署代码
右键单击流程 BPEL 文件 (OrderValidate.bpel),选择 Enterprise Services-Generate Deploy Code。
单击 Referenced Partners(ValidateOrder)并单击“Browse”来定位在步骤 3 中创建的 Java 服务包装器的服务 WSDL 文件(“COATSAccessJavaService.wsdl”)。然后单击 OK,生成 BPEL 部署代码。
图 16. 生成 BPEL 部署代码

现在您就已经准备好运行调用 CICS Web 服务的流程了。
结束语
在本文中,我们提供了循序渐进的方法来开发构件,这些构件是使用用于 CICS 的 SOAP 特性从工作流过程中调用遗留 CICS 业务逻辑所需要的。我们说明了如何开发服务请求者端构件以及如何将 CICS 服务与工作流集成在一起。此外,我们还描述了各种工具的使用,其中包括 Enterprise Developer、WebSphere Studio Application Developer Integration Edition 和运行时环境(例如,WebSphere Business Integration Server Foundation 和 CICS)。 |