IBM®
跳转到主要内容
    中国 [选择]    使用条款
 
 
Select a scope: Search for:    
    首页    产品    服务与解决方案     支持与下载    个性化服务    
跳转到主要内容

developerWorks 中国  >  WebSphere  >

WBI应用实践: WAS 5 EE中的流程策划器

developerWorks
文档选项

未显示需要 JavaScript 的文档选项


级别: 初级

徐进波 (xujb@cn.ibm.com), 软件工程师, 全球化认证实验室,IBM CSDL, 上海

2003 年 12 月 01 日

WebSphere Business Integration(以下简称WBI)是IBM新一代的应用整合套件,它提供了完整的应用整合的解决方案。本文将通过一个示例讲解如何使用WBI中的WebSphere Application Server 5企业版(以下简称WAS 5 EE)来建立流程模型,整合各类业务逻辑。

概述

WebSphere Business Integration(以下简称WBI)是IBM新一代的应用整合套件,它提供了完整的应用整合的解决方案。本文将通过一个示例讲解如何使用WBI中的WebSphere Application Server 5企业版(以下简称WAS 5 EE)来建立流程模型,整合各类业务逻辑。





回页首


约定

  • 本文中提到的与WAS EE相关的中文词汇与其英文原文的对应关系如下:
    流程策划器 - Process Choreographer
    进程 - Process
    活动 - Activity,Activities
    控制流 - Control Flow
    数据流 - Data Flow
    工作项 - Work item




回页首


本文的读者

本文的读者应该对DB2,WAS有一定的了解,对EJB和Web Services有一定的认识,并有使用WSAD或Eclipse的经验。





回页首


WAS 5 EE简介

IBM WebSphere Application Server (WAS)是为动态电子商务应用设计的高性能,高扩展性的事务引擎。它的开放式服务构架为企业应用安全地处理大批量的事务和Web Services提供了一个良好的平台。WAS是一个支持Web Services,兼容J2EE的应用程序服务器,它为电子商务随需应变提供了方便的开发环境。WAS 5 EE中的一个新功能就是加入了流程策划器,从而实现基于J2EE组件和Web Services的应用整合。





回页首


WAS 5 EE中的流程策划器简介

广泛应用于企业内部的业务流程一般既涉及到人员又涉及到其他的IT资源,业务流程的种类也多种多样,既可以是简单的网页的流转,也可以是基于Web Services的应用,还可能是包含事务处理在内的复杂的流程。有的流程需要在异常中断后能自动恢复,有的流程则需要人工干预来处理异常。WAS 5 EE中的流程策划器使得WAS有能力整合所有上述的业务流程。使用流程策划器,可以将业务流程和WAS中的其他服务,如J2EE中的组件,配合使用,使得流程中可以调用各类已有的J2EE组件和Web Services。流程策划器还提供了一个基于Web的客户端,使得在流程中涉及到的人员可以通过该客户端看到自己的工作项,并能对这些工作项进行相应的处理。





回页首


示例流程说明

我们使用一个银行贷款的例子来讲解如何使用流程策划器处理业务流程。这个流程从接收到客户的贷款申请开始,经过一个简单的流程,最终返回给客户是否同意本次贷款的信息。流程描述如下:


图表 1 简单贷款流程
图表 1 简单贷款流程

1. 评估贷款风险:客户提出贷款申请后,触发流程启动,流程的第一步就是评价此次贷款的风险。在这一步,首先收集来自客户的信息,根据业务逻辑的不同,给出此次贷款的风险。

2. 如果风险低,则进入记录贷款信息。将此次贷款的信息存入数据库。然后返回此笔贷款已获批准的信息。

3. 如果风险高,则需要贷款经理的批准。然后返回贷款经理的批复信息。





回页首


示例流程分析

在这个简单的流程中,涉及到了人员活动和两个应用。

1. 评估贷款风险可以是一个使用固定规则进行风险评估的程序,它接受客户贷款的信息,返回贷款的风险。

2. 记录贷款信息也可以用一个程序来实现,因为与数据库有关,我们可以在此处使用EJB与数据库相连,接受贷款风险评估系统传入的数据,将其存入数据库中。

3. 贷款经理批复是一个涉及人员的活动,贷款经理看到由贷款风险程序传来的贷款信息,决定是否批准此次贷款,然后将批复信息返回。





回页首


示例流程实现

通过上述分析,为了实现该流程,需要完成:

1. 评估贷款风险程序实现该程序要完成的功能是得到传入的客户贷款信息,通过贷款信息中的数据,依照一定的规则,给出贷款风险。我们将使用一个Java Class来实现该程序,简便起见,我们将根据贷款信息中的贷款额度来判别风险,如果额度大于10000,则认为是高风险,反之认为是低风险

2. 记录贷款信息程序实现该程序将贷款风险评估程序传入的数据存入数据库中,我们将使用EJB来实现,同时展示如何将EJB服务嵌入流程策划器中。

3. 人员的定义流程策划器有较为复杂的人员使用解决方案。该流程中涉及到一个人员,贷款经理。

4. 使用WSAD的应用整合版本V5.0(以下简称WSAD IE)创建流程WAS 5 EE中的流程策划器,需要通过WSAD IE来作为开发工具开发流程。WSAD还能利用内置的WAS 5 EE测试环境对流程进行调试。

5. 导出流程,并将其发布到WAS 5 EE中测试。

安装所需软件

在本例中,我们使用到如下IBM产品(for Windows平台)
DB2 UDB V8.1
WAS Enterprise Edition V5.0.2
WSAD Integration Edition V5.0
请确保以上产品都安装完成并能正常启动。
在下面的开发过程中,我们使用WSAD IE作为开发工具,启动WSAD IE时,默认的透视图就是"业务集成"透视图。在下面的流程开发过程中,主要是使用该透视图。由于我们要开发Java应用和EJB应用,所以还会用到"J2EE"透视图和"Java"透视图。

准备数据库环境

用户提交的贷款信息最终将被存入数据库中,因此我们需要为贷款信息准备一张数据库表。请使用如下的SQL语句创建数据库及数据库表。为简便起见,将该表的主键设为用户的姓名(name),其它的信息包括用户地址(address),贷款金额(credit_amount),贷款风险值(risk_factor),和是否被批准(approval)。

create db db2app;
connect to db2app;
CREATE TABLE creditinfo (
 name VARCHAR(40) NOT NULL PRIMARY KEY,
 address  VARCHAR(200) NOT NULL,
 credit_amount  INTEGER  NOT NULL,
 risk_factor  VARCHAR(10)  NOT NULL,
  approval    VARCHAR(10)  NOT NULL);
connect reset;
    

开发贷款风险评估程序

贷款风险评估程序是一个简单的Java类,我们将在WSAD的Java透视图中开发该Java应用。

1. 打开WSAD IE,单击左上角的"打开透视图"按钮,在弹出的对话框中选择Java,Java透视图被打开。在"包浏览器"视图中的空白处单击右键,在菜单中选择 新建 〉项目…,在新建对话框中,在左侧栏中选择Java,右侧栏中选择Java项目,单击下一步,输入"LoanApplyJava"作为项目名,单击完成。

2. 右键单击刚刚创建的项目"LoanApplyJava",在菜单中选择 新建 〉包,在新建对话框中,保留源文件夹为"LoanApplyJava",在名称处输入"sample.loanapply",单击完成。

3. 右键单击刚刚创建的包"sample.loanapply",在菜单中选择 新建 〉类,在新建对话框中,在名称处输入"AssessRisk"作为类名称,保留其它项的值不变,单击完成。

4. 为接受客户贷款信息数据,需要创建一个Java类与该数据结构对应。右键单击包"sample.loanapply",在菜单中选择 新建 〉类,在新建对话框中,在名称处输入"CreditInfo"作为类名称。由于该类将在下面的步骤中被作为数据传递给Web Services,因此该类需要实现java.io.Serializable接口,在接口项处,单击"添加…"按钮,在实现接口选择对话框中,输入"Serializable",在匹配类型处选中出现的接口"Serializable",在限定符处选择"java.io",单击添加,然后单击确定返回新建对话框。保留其它项的值不变,单击完成。


图表 2 类CreditInfo需要实现java.io.Serializable接口
图表 2 类CreditInfo需要实现java.io.Serializable接口

5. 与数据库中的字段对应地,在新建的CreditInfo类中添加如下私有成员变量。

private String Name;
private String Address;
private int CreditAmount;
private String RiskFactor;
private String Approval;
    

按"Ctrl + S"键保存该类。在左下角的"轮廓"视图中,选中所有的成员变量(先选中第一个成员变量,按住Shift键,再单击最后一个成员变量),在选中的区域单击右键,在菜单中选择"生成Getter和Setter…",在弹出的对话框中选择确定。WSAD将会为所有的变量生成Get和Set的方法。


图表 3 为成员变量生成get和set方法
图表 3 为成员变量生成get和set方法

6. 在AssessRisk类中,添加方法assessRisk,代码如下:

public CreditInfo assessRisk(CreditInfo ci) {
 // Assess the risk using data in CreditInfo
 CreditInfo ciNew = new CreditInfo();
 ciNew.setAddress(ci.getAddress());
 ciNew.setName(ci.getName());
 int amount = ci.getCreditAmount();
 ciNew.setCreditAmount(amount);
 if (amount < 10000) {
  ciNew.setRiskFactor("LOW");
 } else {
  ciNew.setRiskFactor("HIGH");
 }
 return ciNew;
}
    

该代码将根据贷款数额的大小设置风险值为"LOW"或"HIGH"。
按"Ctrl + S"保存对AssessRisk类的修改。

开发记录贷款信息程序

记录贷款信息程序是一个EJB应用,我们使用WSAD提供的从数据库表到EJB的工具来生成CMP EJB,并开发一个会话Bean来访问该CMP EJB。

1. 在"业务集成"透视图下,选择"服务"视图下的"J2EE层次结构"标签,切换至"J2EE层次结构"视图。

2. 右键单击"EJB模块",在菜单中选择 新建 〉EJB项目,在EJB项目创建对话框中,选择"创建2.0 EJB项目"单选按钮,单击下一步。

3. 在项目名处输入"CreditEJB",在企业应用程序项目的新项目名处,输入"CreditApp",其它使用默认值,单击完成。创建完成后,J2EE透视图将被打开。


图表 4 创建EJB项目
图表 4 创建EJB项目

4. 在"J2EE层次结构"视图中,右键单击刚刚生成的EJB项目"CreditEJB",在菜单中选择 生成 〉从EJB到RDB的映射…。EJB至RDB的映射对话框被打开。单击下一步直至"数据库连接"页面。配置如下参数,单击下一步


图表 5 建立数据库连接
图表 5 建立数据库连接
参数
连接名与系统中不重名的连接名,如Creditinfo
数据库与EJB对应的数据库表所在的数据库名,为db2app
用户标识访问数据库的用户,如db2admin
密码访问数据库的用户对应的密码
数据库供应商类型DB2 Universal Database V8.1
JDBC驱动程序IBM DB2 APP DRIVER
类位置包含JDBC驱动程序的文件所在的位置,如:C:\Program Files\SQLLIB\java\db2java.zip

5. 在"选择性数据库导入"页面中,选中标"CREDITINFO",单击下一步

6. 将"生成的EJB类的包"改为"sample.loanapply",保留其它项的值不变,单击完成。CMP EJB生成完成。下面开始开发一个会话Bean来访问该CMP EJB。

7. 在"J2EE层次结构"视图中,右键单击EJB项目"CreditEJB",在菜单中选择 新建 〉企业Bean。创建企业Bean对话框被打开,单击下一步。

8. 在Bean名处输入"CreditSessionEJB"作为会话Bean的名称。单击下一步。

9. 在"企业Bean详细信息"页面上,单击完成。由于在该会话Bean中要引用到LoanApplyJava项目中的CreditInfo类,需要将CreditInfo所在的项目放在该EJB的类路径中。在"J2EE层次结构"视图中,右键单击EJB项目"CreditEJB",在菜单中选择 特性,在弹出的对话框中,选择左侧的"Java构建路径",在右侧单击"项目"标签,选中"LoanApplyJava"项目,单击确定。


图表 6 将LoanApplyJava项目添加到EJB项目的类路径中
图表 6 将LoanApplyJava项目添加到EJB项目的类路径中

10. 在"J2EE层次结构"视图中,展开 EJB模块 〉 CreditEJB 〉 CreditSessionEJB,双击"CreditSessionEJBBean"打开该Java类,在其中添加方法saveCredit如下:

public boolean saveCredit(CreditInfo ci) {
  boolean saveSucc = true;
  CreditinfoLocalHome ciHome = null;
  try {
   javax.naming.InitialContext ctx = new javax.naming.InitialContext();
   ciHome = (CreditinfoLocalHome) ctx.lookup("java:comp/env/ejb/Creditinfo");
   CreditinfoKey cik = new CreditinfoKey(ci.getName());
   CreditinfoLocal ciLocal = ciHome.findByPrimaryKey(cik);
   // If record does not exist, create it
   if (ciLocal == null) {
    ciLocal = ciHome.create(ci.getName(),
      ci.getAddress(),
      new Integer(ci.getCreditAmount()),
      ci.getRiskFactor(),
      "Yes");
   } else {
    // update the vlaues
    ciLocal.setAddress(ci.getAddress());
    ciLocal.setCredit_amount(new Integer(ci.getCreditAmount()));
    ciLocal.setRisk_factor(ci.getRiskFactor());
    ciLocal.setApproval("Yes");
   }
  } catch (FinderException e) {
   try {
    System.out.println("No such record, create one.");
    ciHome.create(ci.getName(),
     ci.getAddress(),
     new Integer(ci.getCreditAmount()),
     ci.getRiskFactor(),
     "Yes");
   } catch (Exception en) {
    saveSucc = false;
    en.printStackTrace();
   }
  } catch (Exception e) {
   saveSucc = false;
   e.printStackTrace();
  }
  return saveSucc;
}
    

注意:在代码中访问CMP EJB时的JNDI名称是java:comp/env/ejb/Creditinfo,这是一个本地的JNDI URL。在下面的部署配置中,需要使用ejb/Creditinfo作为会话Bean对实体bean的引用名称。

11. 需要将刚才创建的方法提升为远程接口才能被外部调用。在左下角的"轮廓"视图中,右键单击saveCredit方法,在菜单中选择 企业Bean 〉提升至远程接口。

12. 设置CMP EJB调用的数据源和会话Bean引用的CMP EJB的URL。在"J2EE层次结构"视图中,双击EJB项目"CreditEJB"。EJB部署描述符编辑器被打开,选择"Bean"标签,并选中左侧栏中的"Creditinfo",在右侧的WebSphere绑定处,设置"CMP容器生成器JNDI名称"为"jdbc/db2app",在后面的WebSphere应用服务器中配置数据源时,将使用"jdbc/db2app"作为数据源的URL。单击"引用"标签,并选中左侧栏中的"CreditSessionEJB",单击下面的"添加…"按钮,在添加引用对话框中,选择"EJB本地引用"单选按钮,单击下一步。在链接处选择"浏览…"按钮,在链接选择对话框中,选择"当前EJB项目中的企业Bean",并在链接下拉列表中选择"Creditinfo",单击确定返回添加EJB本地引用对话框。注意名称处被自动填入"ejb/Creditinfo",单击完成。按"Ctrl + S"保存修改。完成后的引用配置如下图示:


图表 7 添加到CMP EJB的引用
图表 7 添加到CMP EJB的引用

13. 为EJB生成部署代码。在"J2EE层次结构"视图中,右键单击EJB项目"CreditEJB",在菜单中选择 生成 〉部署和RMIC代码…,在对话框中单击"全部选中"按钮,单击完成。

定义人员

流程策划器可以使用多种方式的人员,如本地操作系统的登陆用户,来自于LDAP的用户或第三方的用户。简便起见,我们使用本地操作系统的登陆用户作为流程中的贷款经理,因此不需要再额外添加人员信息。

创建流程

WAS中的流程与其他业务流程类似,都是通过控制流将各个活动连接在一起,控制流通过在其中定义的条件控制流程的走向,活动通过定义在其中的属性与不同的应用相连,从不同的系统中取得或存放信息。在各个活动之间可以传递数据。WAS EE中的流程可以通过Web Services的方式与其他的应用相连,因此在创建流程时,我们将按照如下步骤进行:

1. 为流程中的活动准备连接到各个应用的服务

2. 创建流程框架

3. 将不同的服务以及涉及到的人员包含到流程中

4. 为生成好的流程创建调用接口,以便发布到WAS服务器中

为流程中的活动准备连接到各个应用的服务

在示例流程中引用了两个应用,首先我们为这两个应用创建服务以被流程调用。

创建服务项目

1. 将透视图转至"业务集成",并选中左上角视图中的"服务"标签,将视图切换至"服务"。

2. 右键单击服务项目,在菜单中选择 新建 〉服务项目,在项目名处输入LoanApply,单击完成

3. 在新创建的项目LoanApply上单击右键,在菜单中选择 新建 〉包,在新建对话框中,保留源文件夹为"LoanApply",在名称处输入"sample.loanapply",单击完成。

4. 由于将使用风险评估程序的服务,需要将LoanApplyJava添加到LoanApply项目的类路径中。右键单击新创建的项目LoanApply,在菜单中选择 特性,在弹出的对话框中,选择左侧的"Java构建路径",在右侧单击"项目"标签,选中"LoanApplyJava"项目,单击确定。

为风险评估程序创建服务

1. 在"服务"视图中,展开 服务项目 〉LoanApply,右键单击sample.loanapply,在菜单中选择 新建 〉服务构建自…,弹出新建服务对话框。

2. 在新建服务对话框中,确认左侧栏中的Java被选中,单击下一步。

3. 在选择方法页面中,单击Java类栏右边的"浏览…"按钮,在类选择对话框中输入AssessRisk,在匹配类型栏中,选中AssessRisk类,单击确定返回新建Java服务对话框,AssessRisk中的方法被显示出来,在类方法栏中,选中assessRisk方法,单击下一步。

4. 在添加Java服务页面中,保留所有值不变,单击完成。此时将有三个WSDL文件产生,这些文件描述了被发布为Web Services的AssessRisk类中的assessRisk方法的所有信息。完成后的文件结构如图:


图表 8 创建Java服务后的服务项目
图表 8 创建Java服务后的服务项目

为记录贷款信息程序创建服务

1. 在"服务"视图中,展开 服务项目 〉LoanApply,右键单击sample.loanapply,在菜单中选择 新建 〉服务构建自…,弹出新建服务对话框。

2. 在新建服务对话框中,选中左侧栏中的EJB,单击下一步。

3. 在EJB方法选择对话框中,展开无状态会话EJB中的CreditApp直至看到CreditSessionEJB,选中CreditSessionEJB,在EJB方法栏中将看到该会话Bean的远程方法,选中saveCredit方法,单击下一步。

4. 在添加EJB服务页面中,保留所有值不变,单击完成。此时将有对话框弹出,提示该会话Bean不在当前项目的类路径中,单击确定将会话Bean添加到当前项目的类路径中。此时将有三个WSDL文件产生,这些文件描述了被发布为Web Services的会话Bean中的saveCredit方法的所有信息。完成后的文件结构如图:


图表 9 创建EJB服务后的服务项目
图表 9 创建EJB服务后的服务项目

创建流程框架

下面将开始流程的创建过程,首先创建流程的框架

1. 在"服务"视图中,展开 服务项目 〉LoanApply,右键单击sample.loanapply,在菜单中选择 新建 〉空服务,弹出新建空服务对话框。

2. 在文件名处输入"LoanApply"作为新的服务的名称。单击完成。新创建的服务被打开。文件名为LoanApply.wsdl。

3. 为该服务定义端口类型和消息。从示例流程的分析中我们知道,流程的输入是一个CreditInfo的数据结构,输出是一个是否同意此次贷款的信息。所以我们需要为该服务创建两个端口以及对应的两种消息。

4. 单击消息类型标签,在端口类型栏中,单击"添加"按钮,将新建的端口类型改名为"InputPortType",在操作栏中,单击"添加"按钮,将新建的操作类型改名为"collectInfo",在操作详细信息栏中,将操作类型设为"单向"。按照上述步骤,添加另一个端口类型"OutputPortType",并为其添加操作类型"sendResult",将"sendResult"的操作类型也设为"单向"。

5. 单击消息标签,在消息栏中,单击"添加"按钮,将新建的消息改名为"InputInfo",在部件栏中,单击"添加"按钮,将新建的部件名称改名为DeliveryData,在部件详细信息栏中,选中"类型或元素"单选按钮,并单击"浏览…"按钮,在选择XSD类型或元素对话框中,展开LoanApply直至找到AssessRisk.wsdl文件,选中该文件,并在下面的下拉列表中选择"CreditInfo",上面的操作将该服务的输入消息类型设为CreditInfo。


图表 10 选择消息类型
图表 10 选择消息类型

6. 按照上述步骤,添加另一个消息"OutputInfo",为其添加部件"result",并设置result部件为"内置类型",并设置内置类型为"xsd:string"。

7. 单击消息类型标签,切换回消息类型页面。在端口类型中选中"InputPortType",在"操作详细信息"的"输入"栏中,单击"浏览…"按钮,在选择消息对话框中选择 LoanApply 〉sample 〉loanapply 〉LoanApply.wsdl,并在下拉列表中选中InputInfo。这样就将消息InputInfo关联到端口InputPortType中了。按照上述步骤,将消息OutputInfo关联到端口类型"OutputPortType"中。按快捷键"Ctrl + S"保存对该服务的修改。

8. 在WAS的流程框架中,输出消息必须是一个服务,因此需要从刚才配置好的服务中将输出消息导成服务。在服务视图中,单击LoanApply.wsdl,在菜单中选择 新建 〉 构建自服务…,在弹出的对话框中的左侧栏中选择 Java服务框架,单击下一步。在指定服务框架是否使用现有端口页面中,保留默认选项,单击下一步。在创建服务框架页面中,在端口类型名的下拉列表中,选择OutputPortType,单击下一步。在指定生成的Java类的名称和位置页面中,保留默认设置,单击完成。将会生成一个OutputPortType.java和其对应的两个WSDL文件。

9. 创建流程框架。在服务视图中,右键单击"LoanApply.wsdl",在菜单中选择 新建 〉 业务进程。新建业务进程对话框被打开。在文件名中输入"LoadApply",单击下一步。在指定业务进程接口页面中,单击输出操作"文件"栏右边的"浏览…"按钮,在文件选择对话框中选择 LoanApply 〉sample 〉loanapply 〉OutputPortTypeJavaService.wsdl,如图示,单击完成。


图表 11 为流程框架指定输入输出服务
图表 11 为流程框架指定输入输出服务

10. 流程框架生成完毕,新生成的流程框架被打开。文件名为"LoanApply.process"。如图示:


图表 12 生成的流程框架
图表 12 生成的流程框架

注意:此时WSAD可能会报告一个错误,"BPED0041E: 活动'输出'上类型为'input'的元素'输出'在流程模型'LoanApply'中已存在。",要消除此错误,在打开的LoanApply.process窗口中选择"变量"标签,将变量栏中的名称"输入"改为"Input",输出改为"Output",按"Ctrl + S"保存修改。

将不同的服务以及涉及到的人员包含到流程中

1. 在流程编辑器中,选中连接输入和输出的控制线,按delete键将其删除。

2. 在左侧的面板中,选择调用服务,将鼠标移植右侧空白处单击,出现新建服务图标。

3. 右键单击新建服务图标,在菜单中选择 特性,在弹出的对话框中,选择左侧栏中的"常规",将右侧的"名称"改为"评价风险"。再选择左侧栏中的"实现",在右侧的文件处单击"浏览…",在文件选择对话框中选择 LoanApply 〉sample 〉loanapply 〉AssessRiskJavaService.wsdl,单击确定返回。在"终端"栏中,选中"输入:assessRiskRequest"项,单击"新建变量…"按钮,在添加变量对话框中,单击确定。对另一项"输出:assessRiskResponse"进行同样的操作,结果如下,单击确定完成新建服务的设置。


图表 13 设置Java服务的属性
图表 13 设置Java服务的属性

4. 重复2、3步的过程,将EJB服务也添加到流程中,将其取名为"保存贷款信息"。

5. 添加贷款经理活动。在左侧的面板中选择人员,将鼠标移至右侧空白处单击,出现人员图标。右键单击人员图标,在菜单中选择 特性,在弹出的对话框中,选择左侧栏中的"常规",将右侧的"名称"改为"贷款经理批复"。选择左侧栏中的"人员",单击右侧的"潜在所有者"项,然后单击"更改…"按钮,在弹出的对话框中,在查询描述下拉列表中选择"Users",将参数栏中"Name"的置设为当前登陆的用户,如"db2admin",单击确定返回特性对话框。用户db2admin将在下面的过程中扮演贷款经理的角色。选择左侧栏中的"数据",然后选中右侧栏中的"输入"项,单击"新建变量…",在添加变量对话框中,将变量名称改为"toManager",在类型中选择"外部",单击右侧的"浏览…"按钮,在选择商业对象对话框中选择 LoanApply 〉sample 〉loanapply 〉AssessRisk.wsdl,并在下面的下拉列表中选择"Type: CreditInfo",单击确定返回添加变量对话框,再单击确定返回特性对话框。同样为"输出"项新建变量"fromManager",类型与"toManager"一样。单击确定完成人员特性的设置。

6. 对上述定义的三个活动,流程需要为它们提供输入以及从他们的返回中取出结果,因此需要在每个活动的前后都定义一个Java代码片断来完成上述功能。要添加一个Java代码片断,在左侧的面板中选择Java代码片断,将鼠标移至右侧空白处单击,出现JavaSnippet图标,右键单击该图标,在菜单中选择"特性",在常规项中就可以为该Java代码片断改名了。按照上述步骤,分别生成如下几个Java代码片断:获取贷款信息,为保存贷款信息准备数据,为贷款经理批复准备数据,设置贷款结果,设置贷款意见。

7. 使用控制链路将所用的活动连接起来。选择左侧面板中的"控制链路",将鼠标移至右侧编辑区域中,在"输入"活动的端点上单击鼠标左键,移动鼠标至"获取贷款信息"的左侧端点上单击。按照上述方式,将"获取贷款信息"与"评价风险"相连,将"评价风险"与"为保存贷款信息准备数据"和"为贷款经理批复准备数据"相连,将"为保存贷款信息准备数据"与"保存贷款信息"相连,将"为贷款经理批复准备数据"与"贷款经理批复"相连,将"保存贷款信息"与"设置贷款结果"相连,将"贷款经理批复"与"设置贷款意见"相连,将"设置贷款结果","设置贷款意见"与"输出"相连,如图示:


图表 14 完成后的流程图
图表 14 完成后的流程图

8. 为每个Java代码片断添加代码,实现对应的功能。

在流程编辑区域中,选中"获取贷款信息",并单击左侧面板中的"显示Java"按钮,在新出现的编辑窗口中的两行注释之间添加如下代码:

sample.loanapply.AssessRisk_msg.AssessRiskRequestMessage arrm = getAssessRiskRequest();
arrm.setCi(getInput().getDeliveryData());
setAssessRiskRequest(arrm);
    

这段代码将"评价风险"活动中的输入对象取出,设置其中的参数为传入流程的数据,并将输入对象设回"评价风险"活动中。这样"评价风险"服务就能使用用户输入的数据进行风险评价了。

为"为保存贷款信息准备数据"定义代码:

sample.loanapply.CreditSessionEJB_msg.SaveCreditRequestMessage scrm = getSaveCreditRequest();
scrm.setCi(getAssessRiskResponse().getResult());
setSaveCreditRequest(scrm);
    

这段代码将风险评价的结果设置到"保存贷款信息"活动的输入数据结构中。

为"为贷款经理批复准备数据"定义代码:

sample.loanapply_msg.CreditInfoMsgMessage cimm = getToManager();
cimm.setPart1(getAssessRiskResponse().getResult());setToManager(cimm);
    

这段代码将风险评价的结果传给人员活动"贷款经理批复",当贷款经理进行操作时,就可以看到从风险评价程序传来的结果了。

为"设置贷款结果"定义代码:

sample.loanapply.LoanApply_msg.OutputInfoMessage oif = getOutput();
oif.setResult("Yes");
setOutput(oif);
    

这段代码直接将贷款结果设置为"Yes"。

为"设置贷款意见"定义代码:

sample.loanapply.LoanApply_msg.OutputInfoMessage oif = getOutput();
oif.setResult(getFromManager().getPart1().getApproval());
setOutput(oif);
    

这段代码将贷款结果设置为贷款经理的批复结果。

9. 为控制流的条件片断定义代码。完成风险评价后,如果风险低,则保存贷款信息,否则需要贷款经理批复。在流程编辑区域中,右键单击"评价风险"到"为保存贷款信息准备数据"的连接线,在菜单中选择"特性",在弹出的对话框中左侧栏中,选择"条件",选中右侧的"Java"单选按钮。单击确定。如果此时"显示Java"按钮已经按下,则在Java编辑窗口中可以看到该连接线对应的Java代码,在代码中的两行注释之间添加如下代码:

String risk = getAssessRiskResponse().getResult().getRiskFactor();
if (risk.equalsIgnoreCase("HIGH")) result = false;
    

这段代码从风险评价活动的返回值中取得风险值,如果风险值为"HIGH",则该连接线的返回为false,即流程不能走该连接线。

然后右键单击"评价风险"到"为贷款经理批复准备数据"之间的连接线,在菜单中选择"特性",在弹出的对话框中左侧栏中,选择"条件",在右侧的条件中选择"内置",并从下拉列表中选择"otherwise"。表明其它条件都不满足时走该连接线。

10. 至此,该流程全部设计完毕。为使得该流程的实例在服务器上运行完成后能保存下来以便查看,需要对该属性进行设置。单击"服务器"标签,将取消对设置栏中"完成时删除进程"的选中,按"Ctrl + S"保存对流程的修改。

为流程创建调用接口

要使得该流程能被使用,需要为其创建接口,我们使用会话Bean作为该流程的接口。

1. 在服务视图中,右键单击"LoanApply.process",在菜单中选择 企业服务 〉生成部署代码…,使用所有默认设置,单击完成。

2. 完成后的服务视图如下,刚才的操作为流程产生了可部署的EJB。


图表 15 接口创建完成后的服务项目
图表 15 接口创建完成后的服务项目

在WSAD IE中测试示例流程

准备测试环境

在WSAD IE中内嵌了WAS EE的测试环境,我们可以使用这个测试环境来测试做好的示例流程

1. 创建服务器和服务器配置,单击WSAD框口左上角的"打开透视图"按钮,在弹出的菜单中选择"服务器"转换至服务器透视图。在服务器配置视图中,右键单击"服务器",在菜单中选择 新建 〉服务器和服务器配置,在弹出的对话框中,在服务器名和文件夹输入框中都输入CreditServer,在服务器类型中选择 WebSphere V5.0 〉EE测试环境,单击完成,让服务器使用默认的端口9080。完成后的服务器配置视图如下所示,有两个项目自动生成并添加到了该服务器中。


图表 16 创建WAS EE测试服务器和服务器配置
图表 16 创建WAS EE测试服务器和服务器配置

2. 在服务器配置中添加数据源以被CMP EJB引用。在服务器配置视图中,双击CreditServer服务器配置,该配置被打开。选择"数据源"标签,在"JDBC提供程序列表"栏中,选中"Default DB2 JDBC Provider",在"在上面选择的JDBC提供程序中定义的数据源"栏中,单击"添加…"按钮,在弹出的对话框中单击下一步,在"修改数据源"页面中,将"名称"设为"Creditinfo","JNDI名称"设为"jdbc/db2app",单击下一步,在"修改资源属性"页面中,在"资源属性"栏中选中"databaseName",将其值设为"db2app",单击完成。完成后的设置如图示:


图表 17 在服务器配置中添加数据源
图表 17 在服务器配置中添加数据源

3. 启用WAS安全性。在服务器配置编辑界面中,选择"安全性"标签,在"单元设置"栏中,选中复选框"启用安全性",并在"服务器标识"中输入管理员用户名,在"服务器密码"和"已确认密码"中输入该管理员的密码。由于EJB将运行在该服务器上,需要把调用到的LoanApplyJava添加到服务器的类路径中。选择"路径"标签,在"类路径"栏中,单击"添加文件夹…"按钮,在弹出的对话框中选择"LoanApplyJava",单击确定。按"Ctrl + S"保存对服务器配置的修改。关闭该服务器配置编辑器。

4. 将EJB项目和流程项目添加到服务器中。在服务器配置视图中,右键单击"CreditServer",在菜单中选择 添加 〉LoanApplyEAR。按照相同的方法将CreditApp添加到服务器配置CreditServer中。

5. 将流程部署到服务器上。在"服务器"视图中,右键单击服务器"CreditServer",在菜单中选择"部署进程"。部署完成后,再右键单击服务器"CreditServer",在菜单中选择"启动"。

测试EJB

在EJB被流程调用之前,应该先测试该EJB能否正确运行。我们可以使用WSAD中的"通用测试客户机"来测试EJB。

1. 在"服务器"视图中,右键单击服务器"CreditServer",在菜单中选择"运行通用测试客户机",测试客户机被打开。

2. 在测试客户机中单击"JNDI资源管理器",展开文件夹"ejb 〉sample 〉loanapply",单击"CreditSessionEJBHome"。

3. 在新页面的左侧,展开"EJB引用 〉CreditSessionEJB 〉CreditSessionEJBHome",单击"CreditSessionEJB create()"方法,在页面的右侧,单击"调用"按钮。在结果栏中单击"使用对象"按钮。在左侧会出现名为"CreditSessionEJB 1"的对象。展开该对象,并单击"boolean saveCredit(CreditInfo)"方法,在右侧页面中,单击"参数"栏下,"CreditInfo"左边的+,按下图输入参数值,并单击"调用"按钮,运行完成后,在下面的结果栏中应该显示返回值为"true"。


图表 18 输入测试EJB的数据
图表 18 输入测试EJB的数据

4. 查看数据库,刚才输入的数据应保存在数据库中了。


图表 19 EJB测试结果
图表 19 EJB测试结果

测试流程

使用WAS EE中的流程策划器Web客户端来测试流程。

1. 打开IE浏览器,在地址栏中输入http://localhost:9080/bpe/webclient,在弹出的对话框中输入定义在流程中的用户名和口令,(也就是用作贷款经理的用户名及其口令),如db2admin/password。单击OK。

2. 根据IE语言设置的不同,流程策划器的会展现不同语言的界面,如果是中文,其界面如下:


图表 20 流程策划器的中文客户端
图表 20 流程策划器的中文客户端

3. 在模板栏中,单击"启动"按钮,启动"LoanApply"的流程实例。在流程启动界面中,如图输入数据,单击启动流程。


图表 21 输入启动流程所需的数据
图表 21 输入启动流程所需的数据

由于输入的金额小于10000,流程将直接写数据到数据库中,并设置RiskFactor为LOW,Approval为Yes从数据库中可以看出相应的数据变化。运行完成后,单击界面中的"由我管理"链接,从右侧栏中选中"Instance1",就可以查看已经完成的流程,包括该流程的输入数据和输出结果。如果在启动流程时将其中的金额改为20000,则流程将停在贷款经理批复活动处,在客户端上,单击"我要执行的任务",在右边的窗口中就会出现"贷款经理批复"的任务,单击该任务进入任务页面,单击"声称任务",就可以看到从风险评价程序传过来的数据,在Approval栏中填入意见,如"No",单击结束任务。流程结束。同样也可以通过"由我管理"来查看已经结束的流程。

将流程发布到WAS EE服务器上

在WSAD中测试通过后,就可以将开发完成的流程发布到WAS EE服务器上了。

1. 确保WAS EE安装完成,流程策划器组件已被安装,流程策划器容器已被正确配置。关于如何安装流程策划器和如何配置流程策划器容器,请参考WAS EE信息中心,该信息中心的地址可以在下面的参考文档中找到。

2. 从WSAD中导出LoanApplyJava应用为LoanApplyJava.jar文件,导出CreditApp项目为CreditApp.ear文件,导出LoanApplyEAR项目为LoanApplyEAR.ear文件。关于如何将项目导出为文件,请参见WSAD帮助文档。

3. 启动WAS EE服务器,打开WAS EE控制台,将CreditApp.ear和LoanApplyEAR.ear发布到WAS EE服务器上。并将LoanApplyJava.jar文件添加到WAS EE服务器的类路径中。关于如何发布EAR文件以及如何设置服务器的类路径,请参考WAS EE信息中心。

4. 在WAS EE服务器上添加数据源,将数据源指向数据库db2app,并将数据源的JNDI名字设为jdbc/db2app。关于如何添加数据源,请参考WAS EE信息中心。

5. 重新启动WAS EE服务器。依照在WSAD中测试流程的方法测试示例流程。应该得到同样的结果。



参考资料

WAS EE信息中心: http://publib.boulder.ibm.com/infocenter/wasinfo/index.jsp

WSAD帮助文档



关于作者

徐进波 是位于上海的全球化认证实验室的软件工程师。他主要致力于IBM产品的全球化整合的开发。喜欢J2EE程序设计,也喜欢各类体育运动。您可以通过 xujb@cn.ibm.com与徐进波联系。




对本文的评价










回页首


IBM 公司保留在 developerWorks 网站上发表的内容的著作权。未经IBM公司或原始作者的书面明确许可,请勿转载。如果您希望转载,请通过 提交转载请求表单 联系我们的编辑团队。
    关于 IBM 隐私条约 联系 IBM 使用条款