级别: 初级 煜 张 (zhangyzy@cn.ibm.com), IBM CSDL
2006 年 1 月 04 日 本文将重点介绍如何利用WSADIE来开发一个具体的业务流程,以及如何利用WSADIE内嵌的WBISF服务器来部署和调试业务流程。
在本系列文章的第一部分WBISF简介中,我们介绍了WBISF的核心概念和开发运行环境。在本章将重点介绍如何利用WSADIE来开发一个具体的业务流程,以及如何利用WSADIE内嵌的WBISF服务器来部署和调试业务流程。
开发步骤
在WSADIE51中开发一个业务流程需要遵循一定的步骤,下面所列出的步骤是比较常规的开发模式。TimeService流程的开发将遵循这些步骤。当然这些步骤并不完全是有先后顺序的,完全可以根据个人的开发习惯来对该步骤进行调整。
- 创建业务项目
- 创建业务流程调用到的业务服务
可以使用自上而下(Top down)或者由下至上的方式(Bottom up)来创建业务服务。
- 自上而下:先创建出服务的抽象定义即WSDL的接口定义,然后使用WSADIE51所提供的向导来产生具体的实现(Java或者EJB)。
- 由下至上:从已有的应用(包括普通的Java类,EJB或者J2C适配器等)创建出业务服务。
- 创建业务流程的接口定义
- 创建业务流程
- 编排业务流程
- 部署业务流程
- 调试业务流程
TimeServiceProcess流程
TimeService是一个简单的流程,该流程的功能是根据输入的地区信息来返回特定的当前时间格式。
图 2.1 TimeServiceProcess 流程
如图2.1所示,TimeServiceProcess流程从客户端接收带有locale信息的请求,首先判断请求的数据是否为空,如果为空则置locale为当前系统的locale,然后调用一个服务来计算出特定的locale的时间,并把该时间返回给客户端。下面介绍如何在WSADIE51中创建、部署调试该流程。
WSADIE51业务集成视图
为了实现该流程,我们首先要切换到业务集成视图中。业务集成视图布局如下图所示(通过Window > Open Perspective > Other > Business Integration可以打开该视图):
图2.2 业务集成视图
业务集成视图主要由左边的导航服务视图、右边的BPEL编辑器两大部分构成。同时在菜单栏上提供了各个功能相对应的各种向导。
在业务集成视图中,服务项目是最基本的可部署的模块,类似于其他普通的Java、J2EE项目,首先要先创建出服务项目,才能接着创建各种服务和流程。
创建业务项目
图2.2 创建业务项目
右键点击服务项目,然后选择新建,在弹出的菜单中选择服务项目,就会弹出新建项目的向导,在该向导中可以设置项目的名称、更改项目的存储位置;这儿我们输入DevProject作为工程的名称,然后点击Finish按钮。这样就创建了一个没有包含任何内容的服务项目。
创建业务服务
WSADIE51提供了丰富的向导来把已有的应用(Java、EJB等)转化成业务服务。在TimeServiceProcess流程中需要调用到一个Java的应用来返回特定的locale的时间格式,为了简单起见,该应用程序只是返回了中国和英国的时间。其实现代码如下所示:
public String calculateLocaleTime(String locale) {
Date dt=new Date();
Locale l = Locale.CHINA;
if (locale.equals("zh")) l = Locale.CHINA;
else if (locale.equals("en")) l = Locale.ENGLISH;
DateFormat dateFormat=
DateFormat.getDateTimeInstance(DateFormat.FULL,DateFormat.FULL,l);
return dateFormat.format(dt);
}
|
首先把该Java类导入到DevProject中。右键单击DevProject,选择创建package,在弹出的对话框中输入timeservice作为该package的名字。然后在timeservice package上单击右键,选择Import > File system,选择TimeUtil.java 文件,点击结束。
然后右键点击TimeUtil.java类,选择New > Service built from…如下图所示:
图2.3 从Java类创建业务服务
在接下来的向导中第一步选择Service的类型为Java,第二步选择calculateLocaleTime方法,最后一步是创建对应的WSDL文档。需要注意这儿不仅自动生成了WSDL的接口定义,还生成了接口实现文档(如图2.4所示)。这儿可以使用所有缺省值。
该向导完成后就自动生成了三个文件,一个是和Java类同名的wsdl文件,该文件包含了该服务的接口定义;一个是Java文件名 + JavaBinding的wsdl文件,该文件包含了该服务的Java绑定,其绑定内容如下表所示;最后一个文件是Java文件名+JavaService的wsdl文件,包含了该文件的访问点。
<binding name="TimeUtilJavaBinding" type="interface1:TimeUtil">
<java:binding/>
<format:typeMapping encoding="Java" style="Java">
<format:typeMap formatType="java.lang.String" typeName="xsd:string"/>
</format:typeMapping>
<operation name="calculateLocaleTime">
<java:operation methodName="calculateLocaleTime"
parameterOrder="locale" returnPart="result"/>
<input name="calculateLocaleTimeRequest"/>
<output name="calculateLocaleTimeResponse"/>
</operation>
</binding>
|
从该表可以看到这儿使用了扩展的Java绑定,通过这种方式可以直接把本地的Java应用直接封装成为一个可以在业务流程中使用的业务服务。
图2.4 自动生成WSDL文档
创建接口定义
在WBISF简介中我们提到一个WSDL文档由两个部分构成,接口定义和接口实现。接口定义部分包含了该服务所使用到的数据类型和提供的操作。在WSADIE51中提供了把接口定义和接口实现分离的能力,因为我们可以先创建出接口定义,然后在部署时再指定具体的绑定协议(SOAP/Java/EJB)。这样就很好的把业务流程和实现相分离。
图2.5 创建接口定义文档
首先为TimeServiceProcess创建一个空的接口定义。右键点击timeservice package,选择New > Empty Service,输入TimeServiceIntf作为文件名,使用向导缺省产生的目标名字空间和WSDL定义名称。然后按结束按钮。完成之后一个空的WSDL定义的图形化工具就打开。
图2.4 WSDL编辑器
通过该图形化编辑器可以从头开始创建出一个完整的WSDL文档。这儿我们只需要创建其接口定义部分就可以,余下的接口实现部分(Services和Bindings)留在部署时候完成。
- 定义PortType和Operation
由于在WSDL中的Operation都是组织到PortType中的,因此首先需要创建PortType。右键点击WSDL编辑器中的Port Types的头部,选择Add Child >Port Type,在弹出的对话框中输入GetTimePT作为该PortType的名字。
然后右键点击GetTimePT,选择Add Child > Operation.在弹出的对话框中输入getTime作为该操作的名字。
右键点击getTime,选择Add Child > Input。
右键点击getTime,选择Add Child > Output。
- 定义Messages
右键点击WSDL编辑器中的Messages头部,选择Add Child > Message。在弹出的对话框中输入InputMsg作为该消息的名字。然后右键点击InputMsg,选择Add Child > Part,输入locale作为其其名字。可以看到系统默认把该Part的类型置为String,这正好满足了要求。如果需要修改类型,则只需要选中该Part,然后在编辑器下方的Part面板中的Type下拉框选择系统预定义的类型或者浏览选择用户自定义的类型。
同理创建另一个名字为OutputMsg的消息,其Part的名字为time。
- 关联Messages和Operation
上述所定义的操作的Input和Output需要和定义的消息相关联。步骤如下:
1. 右键点击getTime下面的Input,Set Message
2. 在弹出的对话框中,选择 Select an existing message
3. 选择tns:InputMsg,点击结束按钮
同理对Output执行上述的操作,在第三步选择tns:OutputMsg。
创建业务流程
图2.5 创建业务流程
在DevProject下的timeservice点击右键,New > Business Process,在弹出的对话框中输入TimeServiceProcess作为文件名,保持其他缺省的值,点击下一步,在下面的选择流程类型向导中选择Sequence-based BPEL Process,点击完成。
Tip:
为什么BPEL4WS语言中会存在两种不同的建模方式(Flow-based 和Sequence-based)?
因为BPEL4WS实际上是两种不同的语言,IBM的WSFL(Web Service Flow Language)和Microsoft的Xlang的结合体。在BPEL4WS出现之前,不同的公司和组织就已经开发了不同的语言来实现Web服务的集成,最终IBM、Microsoft等公司联合起来在WSFL和Xlang的基础上统一制定了BPEL4WS规范,并把它提交给OASIS进行标准化,从而产生了最终的BPEL4WS标准。因为WSFL是一种基于有向图的流程定义语言,而Xlang则是一种基于结构化编程的流程定义语言,所以BPEL4WS作为这两者的融合体,自然也就包含了这两种风格的建模方式。
目前最新的BPEL4WS标准仍然在制定之中,可以从下面的链接中得到最新的进展信息:
http://www.oasis-open.org/committees/tc_home.php?wg_abbrev=wsbpel |
在该向导结束后就会自动打开流程编辑器:
图2.6 BPEL流程编辑器
如图2.6所示,流程编辑器由七大部分构成:
1. 流程编排区:流程的编排在该区域完成。通过拖拽的所见即所得的方式把各种活动拖到该区域并按照一定的业务逻辑把他们编排起来,就完成了业务流程的设计。
2. 活动面板区:在该区域包含了所有的BPEL定义的活动以及IBM扩展的活动的图标。可以直接把这些图标拖放到流程编排区来构建流程。
3. 变量区:该区域包含了流程所使用到的变量的定义。
4. 伙伴链接区:包含了与该流程交互的伙伴的接口定义和流程自身的接口定义。
5. 相关集区:在此可以定义流程中所使用到的相关集。具体的相关集的概念可以参考WBISF简介中的解释。
6. 动作条区:该区域显示和该活动相关的动作,如可以在Receive活动上添加变量、伙伴等。
7. 详细信息区:该区域显示了在流程编排区所选择的对象的所有的属性。如图2.6所示,当前选择的对象是Receive活动,则在该区域显示了和该活动所有的相关的属性。
编排业务流程
创建业务流程伙伴
在WBISF中,业务流程伙伴分为两种类型,一种是该流称所调用的服务的接口定义,另一种是流程自身的接口定义。首先定义流程自身所使用的伙伴链接。
由于创建一个新的流程时WSADIE51默认就为该流程创建了其伙伴链接和变量,需要先把它们删除。右键点击PartnerLink,选择删除;同理删除InputVariable并保存所作的修改。
然后在服务视图下的DevProject中选择TimeServiceIntf.wsdl文件并把它拖到BEPL编辑器中,松开鼠标后就会弹出如下图所示的对话框,保持其默认值并确定。
图2.7 选择服务
然后点击生成的GetTimePT伙伴链接,在其实现的Tab页点击?按钮,如下图所示:
切换伙伴链接类型
这儿切换类型的原因是该伙伴链接代表的是流程本省所提供给服务调用者的接口,因此角色类型是ProcessRole。
然后再把TimeUtilJavaService.wsdl拖放到编辑器中,这时候会弹出如图2.8所示的对话框:
图2.8 包含了接口实现的服务
可以看到这儿的内容比图2.7所显示的内容多了Port和Service两项,这是因为我们这儿使用的是接口实现文档而非接口定义文档。当然也可以只把TimeUtil.wsdl拖到该编辑器中,这样就和图2.7一样,如果用这种方式,则需要在生成部署代码的时候选择该接口定义的具体实现。
创建和编辑活动
根据图2.1的流程图在BPEL编辑器中创建出该流程,如下图所示。首先是一个Receive活动负责接收客户端请求,然后是一个Switch活动来判断是否请求消息中的Locale数据为空,如果为空则使用一个Assign给Locale数据赋值;接下来就用一个Invoke活动来调用在上述所创建的TimeUtil服务。最后使用Reply把产生的结果返回。
图2.9 TimeServiceProcess流程
部署业务流程
保存所做的工作时WSADIE就会开始编译该流程。如果没有什么错误后就可以开始部署业务流程了。
生成部署代码
只是包含了BPEL流程定义文件和WSDL文件的流程是不能直接部署到WBISF服务器上的,这是因为WBISF是建立在WAS应用服务器之上,而应用服务器的基本可部署单元是EAR/WAR文件,因此需要把流程封装成可部署单元。
右键单击TimeServiceProcess文件,选择生成部署代码。如下图所示:
图2.10 生成部署代码
在弹出的生成部署代码的对话框中就可以设置流程自身的绑定类型和选择流程所调用的业务服务的绑定信息。
图2.11 生成BPEL部署代码
在生成BPEL部署代码向导中包含了三个部分:
1. 为流程自身所使用的接口选择具体的绑定信息。对短流程来说,默认的绑定是EJB绑定,当然也可以继续添加其他的如JMS,SOAP/HTTP等绑定。针对这些不同的绑定方式,向导会自动生成相应的WSDL文件和EJB。在此保持默认的选择。
2. 第二部分是为流程所调用的伙伴选择具体的接口实现信息,在创建业务流程伙伴中直接使用了包含接口实现的wsdl定义,这儿就已经设置这些信息。如果在创建业务流程伙伴中只是把接口定义拖入到编辑器中,则这儿需要选择TimeUtilJavaService.wsdl文件。
3. 第三部分是与人工活动相关联的设置,这部分内容将在后续的实例中进行解释。
在完成该向导后,可以看到向导自动生成了三部分内容(如图2.12所示)。
1. 第二部分则是根据不同的绑定类型所自动生成的接口实现文档。这部分信息是发布给客户端使用的,也就是说客户端在得到该文档后就可以通过RMI(EJB绑定)的方式来访问该流程。
2. 第一部分是流程和流程所调用的服务的接口定义中的消息定义的Java代码表示。
3. 这部分是最终产生的无状态会话Bean。在该EJB中自动生成的方法和流程的接口定义中的操作是一一对应的。这样流程就可以作为一个普通的EJB来被客户端所调用。
图2.12 自动生成代码
创建服务器和服务器配置
在WSADIE51中已经包含了一个配置好的WBISF服务器,可以使用这个服务器来测试所创建的业务流程。
切换到J2EE视图(可以通过 Windows > Open Perspective > J2EE来打开),然后右键点击Servers,选择创建服务器和服务器配置。
图2.13 创建服务器和服务器配置
在弹出的对话框中输入服务器名字DevServer,选择服务器类型为集成测试环境,然后点击结束。
图2.14 配置服务器
调试业务流程
发布业务流程
首先需要把该流程发布到服务器中。右键点击创建的服务器DevServer,在弹出的菜单中选择Add and Remove Projects,然后把DevProjectEAR加入到已配置的项目中。这个动作就把这个EAR部署到了WBISF中,并把包含在该EAR中的业务流程部署到服务器中。然后右键单击DevServer并在弹出菜单中选择Debug(当然也可以直接选择Start来运行该流程,但这样就不能在流程中设置断点来跟踪流程的执行)。等待在Console中出现Server is ready for debugging的字样。这时候Debug视图就会自动出现。
设置调试断点
在WSADIE中可以通过可视化的方式来调试业务流程,通过这功能可以非常方便地定位和修复流程中的问题。
图2.15 调试业务流程
WSADIE提供的调试功能主要包括了如下的三个方面:
1. 在活动执行之前和之后设置断点
图2.16 为活动设置断点
2. 动态修改变量的数值
如图2.15所示,在调试过程中可以在变量视图中查看和修改流程变量的数值。
3. 调试Java代码
如果流程中使用了扩展的Java Snippet,则直接可以在Java代码上设置断点,可以象调试普通的Java程序一样对Java Snippet进行调试。
在设置好各个断点后就可以启动流程进行调试了。
使用Web客户端
在WBISF中提供了一个内嵌的Web客户端,可以通过该客户端来对流程进行管理。首先切换到J2EE视图,然后在Server tab页中右键点击DevServer,在弹出的菜单中选择Launch Business Process Web Client。如下图所示。
图2.17 启动Web客户端
然后WBISF就会在WSADIE中启动该客户端。
图2.18 Web客户端
该Web客户端提供了如下的功能:
1. 启动流程实例
2. 为人工活动提供了人工交互的界面
3. 管理和监控流程实例(终止、挂起、恢复等)
在这儿使用如下的方式来启动流程实例:点击My Templates,在右边出现的列表中选择TimeServiceProcess并点击StartInstance;然后在出现的页面中输入locale的值(可以是zh,en或者是空值)。然后再点击StartInstance。然后系统就会自动切换到Debug视图中,流程会停止在设置了断点的活动上。现在就可以开始调试业务流程了。在流程调试结束后可以切换到Web客户端来查看流程的运行结果。
结束语
在本章中通过一个简单的TimeService流程来详细的介绍了如何在WSADIE中开发和调试业务流程。通过这些明确划分的步骤可以快速的开发出所需的业务流程来。但这儿只是覆盖了很简单的功能,实际的业务流程包含了很多高级的特性,如补偿,人工活动等。因此后续的章节将会在这些方面进行深入的阐述。
参考资料
关于作者
对本文的评价
|