|
引言
IBM? WebSphere? Business Integration Server Foundation(以下简称为 WBISF)是 IBM 在 2003 年推出的业务整合平台。目前它的升级产品是 WebSphere Process Server(以下简称为 WPS)。WBISF 基于 Web 服务调用框架(WSIF, Web Services Invocation Framework),而 WPS 则是基于服务组件架构(Service Component Architecture,简称 SCA)编程模型和服务数据对象数据模型(Service Data Object,简称 SDO)的包含了开放标准的面向服务的体系结构(Service Oriented Architecture,简称 SOA)。由于这两者的编程模型完全不同,所以不能从 WBISF 直接升级到 WPS,我们这里所说的移植是指构件(artifact)层面的移植。
本文介绍了如何从 WBISF 向 WPS 移植一个端到端的应用。我们将使用与 WPS 配套的开发工具――WebSphere Integration Developer(以下简称为 WID)来移植完整的应用,并使用 WID 自带的 WPS 测试环境来测试业务流程。本文中所有步骤都是在 Windows? 平台上的 WID 中执行的。
WBISF 到 WPS 的源构件移植
如图 1 所示,我们不能从 WBISF 直接升级到 WPS,以使 WBISF 上的应用可以在 WPS 上直接使用。我们这里所说的移植是构件(artifact)的移植。为了帮助 WBISF 的客户将 WBISF 上已有的应用移植到 WPS,IBM 在 WID 中提供了相应的工具:WSADIE 源构件移植向导。用户首先从 WBISF 配套的集成开发环境―― WebSphere Studio Application Developer Integration Edition(以下称为 WSADIE )中将应用程序的源代码拷贝出来,使用 WID 的 WSADIE 源构件移植工具将其移植到 WID 中,再将移植后的应用程序部署到 WPS 上。在此过程中,WID 提供的移植向导将尽可能自动移植所有 BPEL 文件和 BPEL WSDL 扩展,但用户可能也需要执行一些手动移植步骤以完成这一移植。图 1 展示了整个移植的路径。
图 1. WBISF 到 WPS 的移植路径
目前,在 WID 中 WSADIE 移植工具一次只能对一个服务项目(Service 项目)进行移植,对其他非服务项目(如 EJB 项目,Web 项目等)需另做手工处理。
待移植的业务应用
我们要移植的是一个端到端的 WBISF 应用,这个流程描述了一个完整的订单处理过程,如下图 2 所示:
图 2. 待移植的业务应用
订单处理的完整步骤如下:
-
用户通过 Web 界面输入订货信息,启动流程;
-
流程首先记录下用户的订单;
-
根据用户订单中货品数量,流程进入以下分支之一:
如果用户订货数量 >= 某一阈值,调用大宗订单处理服务,转到步骤 4);如果用户订货数量 < 某一阈值,转到步骤 5);
-
用户订货数量超过阈值,进行大宗订单处理服务;
-
调用供货系统服务;
-
结束流程。
我们提供的资源包是从 WSADIE V5.1.1.13 的工作区中拷贝出来的,所有的应用在 WBISF V5.1.1.7 中测试通过。资源包中包括了以下四个部分:
-
OrderEJB 是一个 EJB 项目,其中包含了一个的 session bean 的实现,它为我们提供了 EJB 服务;
-
OrderProcess 服务项目包含了一个 BPEL 流程,其中包含了 WSADIE 服务项目中的最基本元素:Java 代码段,switch activity,java 服务调用,EJB 服务调用和对子流程的调用;
-
Inventory Service 项目包含了一个 BPEL 子流程,此流程将被 OrderProcess 流程调用;
-
OPWebClient 项目包含了 OrderRequest JSP 和 OrderProcess Servlet,用户将通过 JSP 页面提交订货申请,启动 OrderProcess Servlet,通过 Servlet 中 EJB 流程绑定接口对 OrderProcess 流进行调用。
工作区中的所有项目如下:
|
项目名称
|
项目类型
|
所在的EAR项目
|
项目描述
| |
OrderEJB
|
EJB项目
|
OrderEJBEAR
|
提供EJB服务
| |
OPWebClient
|
Web项目
|
OPWebClientEAR
|
提供用户界面
| |
OrderProcess
|
Service项目
|
-
|
主流程项目
| |
InventoryService
|
Service项目
|
-
|
子流程项目
| |
OrderEJBEAR
|
EAR项目
|
-
|
| |
OPWebClientEAR
|
EAR项目
|
-
|
|
OrderProcess 流程的 BPEL 图如下所示:
图 3. OrderProcess 流程的 BPEL 图表
在执行下面章节的移植工作前,请将本文提供的资源包(OP_WSADIE511.zip)解压缩到一个临时文件夹,其中包含了一个完整的 WSADIE 工作区。并从 Windows 开始菜单启动 WID,选择开始 -> 所有程序 -> IBM WebSphere Integration Developer -> IBM WebSphere Integration Developer V6.1 -> WebSphere Integration Developer V6.1。
源构件移植过程
一般而言,WBISF 上的一个完整的业务整合场景到 WPS 上的源构件移植包括以下三个部分:
-
源构件移植前的准备,可能需要的准备有:
-
对 WSADIE 工作区进行备份;
-
建立新的 WID 工作区,从 WSADIE 工作区拷贝所有非服务项目到 WID 工作区中(WSADIE 中的服务项目会自动产生对应的 EAR ,EJB 和 WEB 项目,这些项目不会在移植中用到);
-
移植非服务项目,如 EJB 项目,Web 项目等。
-
对服务项目进行移植,可以有两种方式完成移植:
-
使用 WID 界面中的移植向导;
-
使用 WID 所带的命令 WSADIEServiceProjectMigration 。
-
源构件移植后的操作,包括:
-
WSADIE 源构件移植工具有一些限制,可能需要手动修改,详见 WID 信息中心;
WPS 和 WBISF 对服务的调用方式是不一样的,在我们的场景中,WBISF 流程的客户端是通过 EJB 流程绑定接口调用到 BPEL 流程,这些客户端代码在移植后需要进一步的改动。
源构件移植前的准备
1. 启动 WID;
2. 建立一个新的 WID 工作区 OP_WID61;
图 4. 新建 WID 工作区
3. 从 WSADIE 工作区中把 OrderEJB,OrderEJBEAR,OPWebClient 和 OPWebClientEAR 项目复制到新的 WID 工作区中;
4. 在 WID 界面中,从菜单栏中选择 File -> Import… -> General -> Existing Projects into Workspace,选择 E:\OP_WID61\OrderEJB,将 EJB 项目导入 WID 工作区中;
图 5. 导入 OrderEJB 项目
5. 重复步骤 4 来导入 OPWebClient,OrderEJBEAR 和 OPWebClientEAR 项目;
6. 右键点击 OrderEJBEAR 项目,选择 Migrate -> J2EE Migration Wizard…,选择 J2EE version 为 1.4,Target Runtime 为 Websphere Process Server v6.1,注意选中 Migration All Module Projects,单击 Finish;
图 6. 使用 J2EE 移植向导
7. 右键点击 OrderEJB 项目,选择 Properties -> Java Build Path -> Libraries,移除所有 WAS_EE_V511\lib 下的 jar 包;
图 7. 移除 Java 编译路径中无效的 Jar 包
8. 重新编译 OrderEJB 和 OrderEJBEAR 项目;
9. 对 OPWebClient 和 OPWebClientEAR 项目重做步骤 6-8,对 OPWebClientEAR 项目运行 J2EE Migration Wizard 并移除 OPWebClient 项目中所有 WAS_EE_V511\lib 下的 jar 包;
注:OPWebClient 项目中还会出现错误,我们会在
移植
WBISF
客户端代码
一
节中解决这些问题。
对服务项目进行移植
对服务项目进行移植时,必须按照服务项目之间的依赖顺序进行移植。在本例中,OrderProcess 项目引用到了 InventoryService 项目和 OrderEJB 项目。因此应该先把这两个项目移植到 WID 工作区中,再完成 OrderProcess 项目的移植。
在这一章节中,我们首先演示如何使用 WID 界面中的 WSADIE 移植向导来完成 InventoryService 服务项目的移植,然后介绍如何使用 WID 的 WSADIEServiceProjectMigration 命令来移植 OrderProcess 服务项目。
使用 WSADIE 移植向导来完成 InventoryService 服务项目的移植
1. 使用 WID 打开工作区 E:\OP_WID61;
2. 在菜单栏中选择 File -> Import;
3. 在导入窗口中选择 Business Integration -> WebSphere Studio Application Developer Integration Edition Service Project,然后单击 Next,这将启动 WSADIE 移植向导。如图 8 所示
图 8. 启动 WSADIE 移植向导
4. 单击 Browse 按钮,选择 WSADIE 工作区中的 InventoryService 项目,这里可以更改移植后的业务整合模块名称。在这里,我们接受默认的 InventoryService 作为模块名,单击 Next;
图 9. 选择要移植的 WSADIE 服务项目
5. 保留选择 Preserve the original BPEL Java snippets in the comments,这将把所有现有的 Java 代码段保留在注释块中。单击 Finish;
6. 移植完成,移植过程中没有发生错误;
图 10. 移植成功完成
7. 重新编译 InventoryService 项目,InventoryService 项目中没有任何错误。
使用 WSADIEServiceProjectMigration 命令来移植 OrderProcess 项目
1. 要使用 WSADIEServiceProjectMigration 命令来移植服务项目,我们应该首先找到此命令所在的目录。对 WID V6.1,此命令通常位于 SHARED_FOLDER_HOME/plugins/com.ibm.wbit.migration.wsadie_6.1.0* 中(其中 SHARED_FOLDER_HOME 是在安装 WID 时指定的共享目录);
2. 关掉所有 WID 的工作区;
3. 打开一个命令行窗口,改变当前目录到步骤 1 中的目录;
清单 1. 改变目录
cd C:\IBM\SDP70Shared\plugins\com.ibm.wbit.migration.wsadie_6.1.0* |
4. 输入以下命令:
清单 2. 执行 WSADIEServiceProjectMigration 命令
WSADIEServiceProjectMigration.bat -e "C:\IBM\WID61" -d "E:\OP_WID61"
-s "E:\OP_WSADIE51\OrderProcess" -t "OrderProcess" |
5. 命令成功完成 , 命令行窗口显示以下信息:
清单 3. 输出信息
INFORMATION:
The source artifact migration from ' E:\OP_WSADIE51\OrderProcess ' to 'E:/
OP_WID61/OrderProcess' is complete.
|
注:WSADIEServiceProjectMigration 命令参数的定义如下
:
-
-e “eclipse 目录”(必须的):Eclipse 运行时(eclipse.exe)所在的目录;
-
-s “源项目所在的目录”(必须的):WSADIE V5,服务项目的完整路径;
-
-d “工作区”(必须的):即将生成的业务整合模块所在的工作区;
-
-t “目标项目的名称”(可选的):即将生成的业务整合模块的名称。
源构件移植后的操作
在完成以上操作后,打开 WID 的工作区,重新编译所有的项目。在 OrderProcess 和 OPWebClient 项目中仍然有错误存在。这首先是因为 WBISF 到 WPS 移植工具仍然有一些限制,需要手动的修改;另外在我们的 WSADIE 应用中,客户端通过调用一个 EJB 接口来与 BPEL 流程交互,这种方式在 WPS 中是不支持的,所以我们必须对客户端代码进行修改。
WSADIE 源构件移植过程中的限制
在移植后的 WID 工作区中,OrderProcess 项目有这样的错误:
图 11. OrderProcess 中的服务定义重名的错误
这是因为在 WSADIE 中,允许在同样的命名空间中存在相同的多个 Web 服务绑定和服务定义,但在 WID 中这样的设置是不允许的。我们通过以下步骤手工改正此错误。
-
在 WID 界面中,选择 Window -> Open Perspective -> Java,打开 Java 透视图;
-
在 Package Explorer 视图中,打开
com.ibm.wbi.pczhang.orderprocess 包中的 orderprocess_ProcessPortType_SOAP.wsdl 文件,更改文件中的 <service name="ProcessPortTypeService"> 字段为:<service name="ProcessPortTypeServiceSOAP">
-
打开
orderprocess_ProcessPortType_SOAPExport.export 文件,更改文件中的 <esbBinding xsi:type="webservice:WebServiceExportBinding" port="ns0:ProcessPortTypeSOAPPort" service="ns0:ProcessPortTypeService"/> 字段为: <esbBinding xsi:type="webservice:WebServiceExportBinding" port="ns0:ProcessPortTypeSOAPPort" service="ns0:ProcessPortTypeServiceSOAP"/>
-
重新编译 OrderProcess 项目,OrderProcess 项目中没有错误。
移植 WBISF 客户端代码
在 OrderProcessWebClient 项目中存在错误,这是因为在我们的 WSADIE 场景中,是使用 WSIF EJB 流程绑定方式来访问 BPEL 服务的。为了把客户端移植到 WID 中,我们必须手动移植这些代码,使用 SCA 编程模型调用 BPEL 业务流程。
1. 使用 WID 打开工作区 OP_WID61;
2. 在菜单栏中选择 File -> New -> Module,新建一个模块,输入模块名为:Client;
图 12. 在 WID 中新建 Client 模块
3. 展开 Client 项目,双击 Assembly Diagram ,打开装配图;
4. 拷贝 OrderProcess 项目中的 OrderProcessIntfc 接口到 Client 项目中;
5. 展开 OrderProcess 项目,选中 Assembly Diagram 下的 OrderProcessExport ,拖放到 Client 项目的装配图中;
6. 在弹出的 Component Creation 窗口中选择 Import with SCA Binding,单击 OK;
7. 在弹出的 Manage Project Dependencies 窗口中,单击 No;
8. 在装配图左侧的工具面板中选中 References,点击 Client 项目的装配图空白处,加入一个 Stand-alone References;
9. 在装配图左侧的工具面板中选中绿色细线图标
,依次单击 Stand-alone References 和 orderprocess 组件;
10. 弹出的消息将通知您“a matching reference will be created on the source node. Do you want to continue?”。单击 OK;
11. 将提示您是否希望为 Stand-alone Reference 生成 Java 接口,而不是 Web 服务描述语言(Web Services Description Language,WSDL)接口。选择 No;
12. Client 项目的装配图如图 13 所示:
图 13. Client 项目中的装配图
13. 保存对 Client 项目的修改,重新编译 Client 项目;
14. 打开 OPWebClient 项目,打开 com.ibm.wbi.pczhang.orderprocess.client 包下的 OPClientServlet.java;
图 14. OPWebClient 项目中产生错误的代码段
15. 使用下面的代码替换 processRequest() 方法:
清单 4. 替换 processRequest() 方法的代码
try {
System.out.println("OP:orderServlet:invoke orderprocess:Begin.");
Service service =
(Service) ServiceManager.INSTANCE.locateService("OrderProcessIntfcPartner");
BOFactory boFactory =(BOFactory) ServiceManager.INSTANCE
.locateService("com/ibm/websphere/bo/BOFactory");
DataObject wrapbo = null;
commonj.sdo.Type inputType =
service.getReference().getOperationType("InputOperation").getInputType();
if(service.getReference().getOperationType("InputOperation")
.isWrapperType(inputType)) {
wrapbo = boFactory.createByType(inputType);
wrapbo.set("custName", req.getParameter("CustName"));
wrapbo.set("custAddress", req.getParameter("CustAddress"));
wrapbo.setInt("itemNumber", Integer.parseInt(req.getParameter("ItemName")));
wrapbo.setInt("quantity", Integer.parseInt(req
.getParameter("Quantity")));
wrapbo.set("requestedDate", req.getParameter("RequestedDate"));
}
service.invoke("InputOperation", wrapbo);
System.out.println("OP:orderServlet:invoke orderprocess:END.");
} catch (Exception ex) {
System.out.println("exceptions in OP:orderServlet:invoke orderprocess:");
ex.printStackTrace();
} |
16. 在 J2EE 透视图下,打开 OPWebClientEAR 项目的部署描述符,单击左下角的 Module 选项,在 Modules 栏中加入 ClientEJB.jar,在 Project Utility JARs 栏中加入 Client.jar。如图 15 所示;
图 15. 将 Client 模块加入 OPWebClientEAR 项目中
重新编译整个工作区,工作区中应该没有错误。
注意:在移植工具自动生成的 OrderProcessApp 项目中,OrderEJB.jar 被放置在 Modules 栏中,这会导致 OrderProcessAPP 无法部署到 WPS 上,我们通过以下步骤改正此问题:
在 J2EE 透视图下,打开 OrderProcessEAR 项目的部署描述符,单击左下角的 Module 选项,在 Modules 中除去 OrderEJB.jar,然后在 Project Utility JARs 中加入 OrderEJB.jar。如图 16 所示。
图 16. 修正 OrderProcessAPP 项目的模块定义
在 WID 中测试移植后的应用
在本节中,我们首先对 WID 自带的 WPS 测试环境进行配置,然后再演示我们迁移后的场景如何在测试环境中运行。
创建 JMS 队列
在使用 WID 自带的 WPS 测试环境来测试我们刚刚移植的场景之前,我们首先需要在 WPS 上配置 JNDI 名称为 jms/orderprocess_JMSExportQueue 的 JMS 队列。这是因为移植工具为 OrderProcess 配置了 JMSExport 接口,如果不配置相应的 JMS 队列,在将 OrderProcessAPP 部署到 WPS 上时会产生错误。
图 17. OrderProcess中JMS队列的定义
使用以下步骤来定义JMS队列:
-
使用 WID 打开 OP_WID61 工作区;
-
在 Server 视图中,右键点击 WebSphere Process Server v6.1,选择 Start;
-
服务器启动完毕后,在 Server 视图中,右键点击 WPS61 测试环境,选择 Run administrative console,WPS 管理界面将在 Integration Developer 的主窗口中打开;
-
单击 WPS 管理界面的左边菜单中资源 -> JMS -> 队列;
-
单击新建,选择 Default messaging provider,单击确定;
-
输入名称:jms/orderprocess_JMSExportQueue,JNDI 名称:jms/orderprocess_JMSExportQueue;
-
在总线名下拉菜单中选择:SCA.APPLICATION.widCell.Bus;
-
在队列名下拉菜单中选择:创建 SIB 目标,进入创建新的队列页面;
-
给出标识为 orderprocess_JMSExportQueue,创建新的队列;
-
创建 JMS 队列如下:
图 18. 创建 JMS 队列
测试应用
我们通过以下步骤来测试移植到 WID 中的应用。
1. 在 WID 中展开 OPWebClient 项目。右键点击 WebContent 下的 order.jsp,选择 Run As -> Run on Server;
2. 在 Run On Server 屏幕中,选择 WebSphere Process Server v6.1 并单击 Next >;
图 19. 指定 WID 自带的 WPS 测试环境
3. 选中 OrderProcessAPP,InventoryServiceAPP,OPWebClientEAR 和 OrderEJBEAR,单击 Add > 来把这几个应用部署到 WPS 上,单击 Finish;
图 20. 把需要的应用配置到 WPS 上
4. WPS 测试服务器启动后,应用程序被发布到该测试服务器。在 WID 的主窗口中,order.jsp 在 Web 浏览器窗口被打开。我们输入相应请求参数的值,然后单击 submit;
图 21. 在请求页面中输入测试订单
5.如果一切进展顺利,在 Console 视图中将显示以下信息:
图 22. 流程执行结果
可以看到,从 OrderServlet 成功调用到了 OrderProcess BPEL 流程。在 OrderProcess 流程中,Logging 服务(Java 服务)、OrderSessionBean 服务(EJB 服务)和 InventoryProcess(BPEL 子流程)被依次调用。
结束语
本文介绍了如何从 WBISF V5.1.1.7 向 WPS V6.1 移植一个完整的端到端的业务应用,以及如何使用 WID V6.1 中自带的 WPS 测试环境来测试移植后的应用。
下载 | 描述 | 名字 | 大小 | 下载方法 |
|---|
| 代码示例 | OP_WSADIE511.zip | 95 KB | HTTP |
|---|
[url]http://www.ibm.com/developerworks/cn/websphere/library/techarticles/0812_yuji/index.html?ca=drs-cn-1203[/url]
|