利用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 的页面等。除此之外,还可以通过日志来完成流程的监控和管理界面。这些都由应用的需求来决定 。