利用JBPM开发一个工作流应用,相对于使用shark是比较简单直观的。我们之前提到过,一个工作流管理系统最基本的组件包括流程定义组件,流程执行组件和流程客户端组件。下面从这三个方面看一下JBPM对开发工组流应用的支持。
1.
流程的定义
JBPM
没有采用WfMC提出的流程定义语言XPDL,而是自己开发了一种称为JPDL的语言来定义流程。因此,在开发一个应用时我们最终需要生成一个符合该XML schema的文件processdefinition.xml来表示定义好的流程。它可以manually获得,也可以使用可视化的定义工具自动生成。
JBPM
专门提供了一个开发流程的环境,称为process development environment(pde)。可以
在
jbpm
根目录下执行命令
ant create.pde
来生成
pde
工作目录
。生成的包结构如下所示:
Build.xml
文件用于配置一个流程,即利
用
ant
工具解析
processdefinition.xml
文件,并将运行流程时所需的相关信息存储到数据库中。
Lib
存放了开发和配置流程所需的全部库文件,包括数据库的
jdbc
驱动。
Src
包括开发和配置流程的全部源文件和所需资源。
Src/config
只有两个文件,
jbpm.properties
和
log4j.properties
。其中,
jbpm.propertie
文件包含了数据库的配置信息。因此,更换数据库或数据库的
jdbc
驱动都需要修改这里。
Scr/java
存放
java
源文件。
Src/process
存放工作流定义文件
(processdefinition.xml)
和相关的资源文件,如图片和
form
文件。
Src/test
存放测试代码。
Target/classes
是
src/java
中源码的输出目录,存放编译后的
class
文件。
Target/par
存放用命令
ant build.process.archives
生成的
par
包。
Par
包实际上就是把
src/process
中的流程定义及相关文件打包成
zip
形式存储。
Target/test-classes
存放测试程序的编译结果。
Target/test-report
存放测试报告。
2. 流程的执行
JBPM
把负责执行流程的类库打包成jbpm.core.jar,它也是JBPM工作流引擎的核心。在开发一个工作流应用时,只需将该jar文件放到相应的lib目录下面。而开发人员就可以专注于开发一个流程模型,完成对流程的定义,而无需过多考虑流程执行的细节。
3.
流程的客户端
客户端组件的开发,需要一个应用服务器作为servlet container,我们这里选择了tomcat。JBPM将开发一个webapp所需的类打包成jbpm.web.jar,包括自定义的tag和Struts用到的类等等。开发应用时,将该jar放到WEB-INF\lib下面就可以了。
一个基于工作流的webapp应用的开发和普通webapp的开发方式很相似。包结构也保持一贯作风:
所以,我们需要做的主要工作是完成客户端应用所需的
jsp
页面的开发,可以选用
Struts
来进行开发。需要注意的是,我们要对
lib
目录下的
jbpm.properties
文件进行配置,主要是对数据库
jdbc
驱动的配置。
4.
系统数据库的创建
JBPM
可以支持多种数据库系统,包括MSSQL,,Mysql,Oracle,hdbsql等。它提供了很灵活的配置方式,只需要修改jbpm.properties文件,同时将相应的JDBC Driver拷贝到lib目录就可以了。利用ant的generate.ddl命令,JBPM还支持自动生成用于创建系统表的sql脚本,而且可以生成对应于各种数据库系统的脚本,非常便于数据库系统的更换和系统数据库的创建。
5. 开发过程
环境配置如下:
JBPM 2.0
Ant 1.6.2
Tomcat 5.0.27
SQL Server 2000
SQL Server 2000 Driver for JDBC
仍以之前演示过的request a payraise为例(见下图),介绍一下利用JBPM开发一个工作流应用需要完成的工作。
1)
首先,我们需要完成流程的定义。这不仅包括定义processdefinition.xml,还要对流程执行时使用到的其他资源进行定义。比如,在web应用中用到的图片,form等。还需要配置form.xml,该文件确定了流程中不同状态和form的关系,如request a payraise状态下,需要如下图所示的form:
补充Processdefinition.xml
示例:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE process-definition PUBLIC "-//jBpm/jBpm Mapping DTD 2.0//EN" "http://jbpm.org/dtd/processdefinition-2.0.dtd">
<process-definition name="pay raise process">
<!-- SWIMLANES -->
<swimlane name="requester" />
<swimlane name="boss">
<delegation class="org.jbpm.delegation.assignment.ActorAssignmentHandler">cg</delegation>
</swimlane>
<swimlane name="erp operator">
<delegation class="org.jbpm.delegation.assignment.ActorAssignmentHandler">pf</delegation>
</swimlane>
<!-- START-STATE -->
<start-state name="request a payraise" swimlane="requester">
<transition to="evaluating"/>
</start-state>
<!-- NODES -->
<state name="evaluating">
<assignment swimlane="boss" />
<transition name="approve" to="fork"/>
<transition name="disapprove" to="done"/>
</state>
<fork name="fork">
<transition to="updating erp asynchronously" />
<transition to="treating collegues on cake and pie" />
</fork>
<state name="updating erp asynchronously">
<assignment swimlane="erp operator" />
<transition to="join" />
</state>
<state name="treating collegues on cake and pie">
<assignment swimlane="requester" />
<transition to="join" />
</state>
<join name="join">
<transition to="done" />
</join>
<!-- END-STATE -->
<end-state name="done" />
</process-definition>
2)
有了processdefinition.xml文件,我们就可以配置流程。即使用ant命令,解析这个文件并且将执行时需要的信息存储在数据库中。如下图:
3)
我们无需关心流程将怎么执行,完全交给jbpm.core.jar就好。
4)
剩下的另外一项比较繁重的工作就是开发一个用于该流程的客户端应用。前面已经提到过,
我们需要做的主要工作是完成客户端应用所需的
jsp
页面的开发。包括登录页面,查看自己的
tasklist
页面,执行
task
的页面等。除此之外,还可以通过日志来完成流程的监控和管理界面。这些都由应用的需求来决定。