级别: 初级 Tilak Mitra (tmitra@us.ibm.com), IT 认证高级架构师, IBM
2005 年 5 月 01 日 本文向您展示了如何使用 WebSphere Business Integration Modeler V5.1 来向业务流程所需的任务中添加业务逻辑。您也将学会如何将业务流程返回到 Web 服务中。
引言
本系列文章的第 1 部分演示了如何使用 IBM® WebSphere® Business Integration Modeler 5.1(以后都称为 Modeler)来对业务流程进行建模。我们列举了一个简单的 Web 订单业务流程的样例,并且展示了如何以业务流程执行语言(Business Process Execution Language,BPEL)的顺承模式对其建模。本文主要内容是将第 1 部分中创建的构件导入到文件系统中,然后将其作为业务流程实现的输入。
这个由两部分构成的系列文章提供了端到端的场景,该场景从向您展示了 WebSphere Business Integration Modeler 是如何执行业务流程的建模工作的。因此 Modeler 的构件可以用于 Application Developer 的 J2EE 开发环境中以实现业务流程,创建流程的 Web 服务定义并通过服务的使用者来调用该服务。
设置项目
首先,让我们在 WebSphere Studio Application Developer Integration Edition(以后都称为 Application Developer)中创建一个新的服务项目,然后导入业务建模实践的输出构件。
- 打开 Application Developer,然后创建新的工作区。打开 Business Integration Perspective。我们将创建一个新的服务项目。服务项目包含了由企业服务或者流程组成的文件。右键单击 Service Project 文件夹,然后选择 New => Service Project。输入该项目的名称,如下图所示,然后单击 Finish。
图 1. 新的服务项目
- 必须将从 modeler 导出的流程的内容(第 1 部分中)导入到新建的
CricketOnline 项目中。右键单击新建的项目,然后单击 Import 菜单项。在对话框中,加亮 File System,然后单击 Next。一直浏览到导出业务流程建模实践的构件的文件夹为止。如下图所示查看文件夹的内容,然后单击 Finish。该操作会将业务流程导入到新建的项目中。
图 2. 导入 BPEL 目录
- 该项目的目录如下图所示。注意到在
Businessitems 文件夹中,在流程建模期间创建的每个业务款项都有一个 Java™ 类表示。同样,BusinessItems.xsd 代表了业务款项的 XML 表示。
图 3. 导入的目录树
- 最重要的构件是
WebOrder.bpel 和 WebOrderInterface.wsdl,这将是下两节的主题。
解析 WebOrder BPEL
在业务建模期间,将建模的每个流程都表示为 BPEL 文件。该文件的格式是 <process_name>.bpel ,其中 process_name 是建模后流程的名称。在我们的场景中,只需对一个流程 WebOrder 进行建模,因此我们在 ProcessCatalog.WebOrder 文件夹中有一个 WebOrder.bpel 文件。双击该 bpel 文件,在流程编辑器中将其打开(见下图)。
图 4. WebOrder BPEL 图表
该流程过程与第 1 部分中的建模流程类似,但是会有一些额外元素出现在 Application Developer 中。WebOrder Receive 代表了能够触发该流程启动的输入元素。WebOrder Reply 代表了流程的输出元素。在单独的任务之中有一些分配(Assign)元素。在该业务流程中也有一个变量清单。
变量存储了能够被业务流程使用的消息。这些变量里的消息通过由一个或多个消息部件组成的 WSDL 消息类型来定义。
分配元素用于将任务的输出信息映射到后续任务的输入信息中。此分配行为用于将数值从一个变量复制到另一个变量。在我们的 WebOrder 业务流程中已经设置了分配行为,并且无需更改,除非需要改变流程过程。
下图显示了一个分配行为如何通过复制变量的信息部分将任务的输出信息复制到后续任务的输入端。下图中的分配行为将 Price Order 任务的输出信息复制到 Save Order 任务的输入端。单击 Assign,在编辑窗格中显示其属性。
图 5. Price Order 和 Save Order 之间的分配行为
注意到 PriceOrderOutputCriteriaVariable 的 Order 消息部分被映射到了 SaveOrderInputCriteriavariable 的 Order 消息部分。检查每一个分配行为有助于理解在该业务流程中如何将不同的任务链接在一起,以及这些相关的和连续的任务如何进行交换。
该流程中的每个任务都与一个伙伴链接相关联。这些伙伴链接识别那些与业务流程进行交互的伙伴。并且每一个伙伴链接都定义了很多操作,这些操作可以是在内部实现的操作,甚至可以是映射到为执行任务而调用的外部服务中的操作的操作行为。单击伙伴链接就会显示该链接相关的任务。
我们的业务流程已经具有了所有必要的已经定义的和映射的变量和分配行为。
解析 WebOrderInterface WSDL
前述步骤中(业务流程建模)创建的每一个业务流程都有一个相对应的接口定义文件(WSDL 格式)。该 WSDL 文件包含了其它元素中的消息(Messages)和端口类型(Port Types)的清单。下图描述了 WebOrderInterface.wsdl 的内容。
图 6. WebOrderInterface WSDL 目录树
使用这些消息构建变量,这些变量复制了单独任务的输入和输出端的数值(正如前面章节所论述的那样)。
端口类型就是命名了的一组抽象操作和涉及到的消息集合。每一种操作都涉及到一组输入和输出消息。
下图演示了封装了输入和输出参数的消息是如何组成 PriceOrderPT 的变量的。
图 7. Port Type 解析
在我们的业务流程中必须要表示出任务的每一种端口类型,这样可以满足负责执行该流程的流程逻辑的要求。在下一节中,我们将使用导入的构件来产生并创建代码,这些代码将会处理我们的业务流程的整体实现。
流程实现
为实现我们的业务流程,需要按顺序执行下面的操作步骤。
实现映射功能
第一个操作步骤就是要实现将 Submit Order 链接到 Price Order 和 Transact Payment 的映射。在很多情况下任务的输出是一个复杂的 datatype。此任务可以连接到将数据作为输入信息来接收的其它任务中去,而这些数据可以包含在复杂 datatype 的内部,其中 datatype 正是前一个任务的输出。
该映射常用于将复杂 datatype 的部件映射到后续任务的输入。在我们的样本中,Submit Order 任务的输出是一个复杂的 datatype——将 Order 和 CreditCard 作为 datatypes 来包含的 RequestData。后续的任务,Price Order 和 Transact Payment,要求 Order 和 CreditCard 分别作为它们的输入信息。我们业务流程中的映射就是为完成此目标。
单击我们的流程样本的 Map 元素,打开流程编辑器下半部分的 Map 的属性和特性。单击 Implementation 链接来呈交 Java 框架填充编辑器(请查看下图),在该编辑器中需要实现逻辑(用于复制变量值)。
图 8. Map 窗格
我们使用 Java 代码片断来实现这种逻辑。它从 RequestData 输出 datatype(属于 Submit Order)中抽取 Order 和 CreditCard 对象实例,并且将其映射到 Map 变量的输出。下面显示了这些 Java 代码片断。
图 9. 实现映射
您必须导入 RequestData,Order 和 CreditCard datatypes 以便对上述的代码片断进行编译。
为单独的任务创建 Java 框架和实现
每一种端口类型都必须具有实现用于业务逻辑,该业务逻辑本应由任务来执行。我们将使用 Java 来实现该业务逻辑。在该流程中需要好几步操作步骤才能实现。必须为给定的端口类型创建 Java 框架。因此必须将业务逻辑添加到框架 Java 类中。
我们按照以下的操作步骤来演示使用了一种端口类型的流程。我们将在该演示中使用 PriceOrderPT 端口类型。
- 右键单击 WebOrderInterface.wsdl 文件里的 PriceOrderPT 端口类型,然后选择 PriceOrderPT => New => Build from Service。
- 现在我们将要创建 Java 服务框架。单击对话框中的 Java Service Skeleton。
图 10. 新建服务的框架窗口
单击 Next。
- 在下一个对话框中,我们将为 Java 框架设置属性。
图 11. Java 服务框架对话框
将用于 WSDL file 属性的数值设置到 WebOrderInterface.wsdl 文件中。(浏览 CricketOnline 项目下的 WebOrder.ProcessCatalog 文件夹,选中 WSDL 文件)。同时将 Port type 的值设置为 PriceOrderPT。对 Port type name 的值采取同样的操作。保留剩余的缺省值。单击 Next。
- 我们想要在分离的程序包中创建 Java 框架(注意到,这样做仅仅是为了更好的组织源文件。即使没有选择新的程序包,一切仍将正常工作)。使用下图所示的数值进行该操作:
图 12. PriceOrderPT 程序包和类名称
- 单击 Finish。
此操作将会结束创建用于 PriceOrderPT 端口类型的 Java 框架的流程。
为设置其它的三个端口类型(SaveOrderPT,SubmitOrderPT, 和 TransactPaymentPT)必须要使用同样的流程。当您将这些端口类型元素关联起来时需要仔细:
- 使用 SaveOrderPT 来创建用于 SaveOrderPT 端口类型的 Java 框架。
- 使用 SubmitOrderPT 来创建用于 SubmitOrderPT 端口类型的 Java 框架。
- 使用 TransactPaymentPT 来创建用于 TransactPaymentPT 端口类型的 Java 框架。
一旦操作完成,文件夹的结构应该会包含以下所显示的新建构件:
图 13. 创建 Java 服务框架的 Culmination
这种创建框架的流程不应该用于 WebOrderPT 的端口类型,因为我们不需要该流程的 Java 实现。因此只需实现它的单独任务。
现在我们必须实现各自 Java 类中的业务逻辑。PriceOrderPT.java 中用于 sendPriceOrder_InputCriteria 方法的业务逻辑显示如下:
为了得到其它所有的 Java 实现的清单,请选择参考资料部分。操作该实现,并且通过更改业务逻辑来查看不同的结果。
流程部署
既然我们已经定义了元素,并且实现了单独的任务,那么就可以部署业务流程了。部署业务流程需要调用很多操作步骤。如同创建用于引用伙伴的代码一样,我们也需要创建用于业务流程的部署代码(代表了单独任务的端口类型)。
- 右键单击 WebOrder.bpel,然后点击 WebOrder.bpel => Enterprise Services... => Generate Deploy Code...。
- 单击 WebOrderPT,然后选择如下显示的字段。(我们将使用 SOAP 而不是 HTTP 作为组织机制来调用 Web 服务,我们将创建该 Web 服务用于我们的业务流程。)
图 15. 部署用于 WebOrder 的参数
单击 Ok。
- 每一个引用的伙伴都必须得到部署。用于 SubmitOrderPT 的部署流程显示如下:
- 对剩余的引用伙伴必须也执行相同的流程。必须为每一种伙伴选择合适的 WSDL 文件,即:
- 用于 PriceOrderPartner 的 PriceOrderPTJavaService.wsdl
- 用于 TransactPaymentPartner 的 TransactPaymentPTJavaService.wsdl
- 用于 SaveOrderPartner 的 SaveOrderPTJavaService.wsdl
这样就连同业务流程的引用伙伴一起完成了业务流程的部署。
生成服务代理(Service Proxy)
现在准备通过任意的服务客户来调用我们的流程。我们将创建一个简易的 J2EE Web 组件来访问我们的业务流程。为简化使用 SOAP/HTTP 调用 Web 服务的操作,我们将创建 Web 服务代理类,该服务代理类使用了服务调用所有的详细信息,并且提供了简易的 Java API 从客户端访问 Web 服务。
在我们的业务流程 WebOrderPT 中,WSDL 被命名为 WebOrder_WebOrderPT_SOAP.wsdl(在 ProcessCatalog.WebOrder程序包中)。Web 服务代理从该 WSDL 文件中创建。请按照以下操作步骤:
- 右键单击 WebOrder_WebOrderPT_SOAP.wsdl => Enterprise Services => Generate Service Proxy,生成服务代理。
- 在代理选择对话框中,选择 Web Service Invocation Framework(WSIF)作为服务代理。单击 Next。
- 因为我们的服务客户是一个 J2EE Web 组件,我们想要在我们的服务客户所驻留的 Web 项目中创建服务代理。该流程部署步骤创建了 Web(
CricketOnlineWeb)和 EJB(CricketOnlineEJB)项目,并将其作为部署流程的一部分。我们将在 CricketOnlineWeb 项目中创建服务代理。下图向你展示了其属性:
图 18. 用于服务代理的属性
单击 Browse 按钮,将右边的 Source folder 更改为 /CricketOnlineWeb/JavaSource。
- 接受其它所有的缺省值,然后单击 Next。
- 在下一个窗口中,选择 sendWebOrder_InputCriteria 操作,然后单击 Finish。
该操作完成了我们的 Web 服务代理的创建工作。现在我们准备创建 J2EE Web 组件,它可以通过它的 Web 服务代理访问我们的业务流程。这将是我们下一节的主题。
实现服务客户
我们的目的是保持该操作的简易性。调用该业务流程最简单的方式就是使用 servlet。我们将在 CricketOnlineWeb Web 项目的 JavaSource 文件夹中创建 servlet。我们的 servlet 的属性如下所示:
图 19. 用于 servlet 的属性
对我们的 servlet 来说,我们只需实现 doGet(...) 方法。该方法的实现创建了 Order 和 CreditCard 的实例 ,并且设置了它们的属性。因此将这些实例添加到 RequestData 对象实例中,并且将它们作为一个参数传送到(WebOrderPTProxy)sendWebOrder_InputCriteria 方法中。于是输出结果就会发回给调用者。以下显示了用于 doGet(...) 方法的代码片断:
既然已经实现了所需求的构件,我们就需要创建运行时来测试业务流程。
创建运行时
我们将创建一个存在该业务流程执行的运行时的服务器。按照以下的操作步骤来创建该服务器,并且调用 servlet 来测试我们的业务流程:
- 切换到 Server 视图。在 Application Developer 左下角的 Server Configuration 窗格上,右键单击 Servers 文件夹,创建新的 Server and Server Configuration。指派新服务器的名称,然后接收缺省设置(见下图)。然后单击 Finish。
图 20. 服务器参数
- 现在我们通过右键单击 CricketOnlineServer 项目,并且使用 Add and Remove projects 菜单项来将 CricketOnlineEAR Enterprise Application 项目添加到新建的 CricketOnlineServer 服务器中。
- 单击 Servers 窗格上的 CricketOnlineServer(位于窗格的下方),然后单击 Start(
)图标,启动 CricketOnlineServer 。成功启动后,会显示以下状态行:
图 21. 服务器状态行
- 该服务器启动后,切换回 Business Integration Perspective。右键单击 CricketOnlineServlet.java,然后选择 Run on Server... 菜单项。选择对话框中的缺省值,然后单击 Finish。
- 调用 servlet 的 doGet(...) 方法。该操作将会打开编辑器中的 Web 浏览器,并且会将操作的结果显示如下:
图 22. 流程调用结果
- 运行时完成后,我们的业务流程也已经得到成功执行。
结束语
本文中,您将第 1 部分中创建的构件导入到 Application Developer 里的新服务项目中去。对该 BPEL 流程进行修改以添加用于 Map 变量的业务逻辑。每一个单独的任务都是通过使用相应的业务逻辑在 Java 中得到实现。从而实现了的业务流程得到了部署。
为便于调用,我们使用了 Application Developer 丰富的工具来创建用于业务流程的 Web 服务定义的 Web 服务代理。同时也实现了能够通过该服务代理模拟调用我们的业务流程的 servlet。创建了运行时环境,并且通过服务客户(servlet)调用了我们的业务流程。
由两部分组成的该系列文章,展示了 Modeler 如何执行业务流程的建模功能。因此在 Application Developer 的 J2EE 开发环境中可以使用 Modeler 的构件来实现该业务流程,创建用于该流程的 Web 服务定义,并且通过服务消费者调用该流程。演示结果就是一个经过测试的端对端场景。
您已经看到了如何连续使用 Modeler 和 Application Developer 迅速地创建,实现以及执行业务流程。
免责声明:自从初次编写本文以来,WebSphere Studio Application Developer Integration Edition 已经从 Version 5.1.0 升级到 5.1.1。如果您正在使用 5.1.1,那么就可以假定所有的操作都会正常进行。
参考资料
关于作者  | 
|  |
Tilak Mitra 是一名 IBM 的认证高级架构师。他专门研究基于 J2EE、MQ 以及其他 EAI 技术的大中型的企业和应用程序体系结构。您可以通过 tmitra@us.ibm.com 与 Tilak 联系。 |
对本文的评价
|