利用JBPM開發(fā)一個工作流應(yīng)用,相對于使用shark是比較簡單直觀的。我們之前提到過,一個工作流管理系統(tǒng)最基本的組件包括流程定義組件,流程執(zhí)行組件和流程客戶端組件。下面從這三個方面看一下JBPM對開發(fā)工組流應(yīng)用的支持。
1.
??流程的定義
JBPM
沒有采用WfMC提出的流程定義語言XPDL,而是自己開發(fā)了一種稱為JPDL的語言來定義流程。因此,在開發(fā)一個應(yīng)用時我們最終需要生成一個符合該XML schema的文件processdefinition.xml來表示定義好的流程。它可以manually獲得,也可以使用可視化的定義工具自動生成。
JBPM
專門提供了一個開發(fā)流程的環(huán)境,稱為process development environment(pde)。可以
在
jbpm
根目錄下執(zhí)行命令
ant create.pde
來生成
pde
工作目錄
。生成的包結(jié)構(gòu)如下所示:
?????????Build.xml
文件用于配置一個流程,即利
用
ant
工具解析
processdefinition.xml
文件,并將運行流程時所需的相關(guān)信息存儲到數(shù)據(jù)庫中。
Lib
存放了開發(fā)和配置流程所需的全部庫文件,包括數(shù)據(jù)庫的
jdbc
驅(qū)動。
Src
包括開發(fā)和配置流程的全部源文件和所需資源。
Src/config
只有兩個文件,
jbpm.properties
和
log4j.properties
。其中,
jbpm.propertie
文件包含了數(shù)據(jù)庫的配置信息。因此,更換數(shù)據(jù)庫或數(shù)據(jù)庫的
jdbc
驅(qū)動都需要修改這里。
Scr/java
存放
java
源文件。
Src/process
存放工作流定義文件
(processdefinition.xml)
和相關(guān)的資源文件,如圖片和
form
文件。
Src/test
存放測試代碼。
Target/classes
是
src/java
中源碼的輸出目錄,存放編譯后的
class
文件。
Target/par
存放用命令
ant build.process.archives
生成的
par
包。
Par
包實際上就是把
src/process
中的流程定義及相關(guān)文件打包成
zip
形式存儲。
Target/test-classes
存放測試程序的編譯結(jié)果。
Target/test-report
存放測試報告。
2.?? 流程的執(zhí)行
JBPM
把負(fù)責(zé)執(zhí)行流程的類庫打包成jbpm.core.jar,它也是JBPM工作流引擎的核心。在開發(fā)一個工作流應(yīng)用時,只需將該jar文件放到相應(yīng)的lib目錄下面。而開發(fā)人員就可以專注于開發(fā)一個流程模型,完成對流程的定義,而無需過多考慮流程執(zhí)行的細(xì)節(jié)。
3.
??流程的客戶端
客戶端組件的開發(fā),需要一個應(yīng)用服務(wù)器作為servlet container,我們這里選擇了tomcat。JBPM將開發(fā)一個webapp所需的類打包成jbpm.web.jar,包括自定義的tag和Struts用到的類等等。開發(fā)應(yīng)用時,將該jar放到WEB-INF\lib下面就可以了。
一個基于工作流的webapp應(yīng)用的開發(fā)和普通webapp的開發(fā)方式很相似。包結(jié)構(gòu)也保持一貫作風(fēng):
??????
所以,我們需要做的主要工作是完成客戶端應(yīng)用所需的
jsp
頁面的開發(fā),可以選用
Struts
來進(jìn)行開發(fā)。需要注意的是,我們要對
lib
目錄下的
jbpm.properties
文件進(jìn)行配置,主要是對數(shù)據(jù)庫
jdbc
驅(qū)動的配置。
4.
?? 系統(tǒng)數(shù)據(jù)庫的創(chuàng)建
JBPM
可以支持多種數(shù)據(jù)庫系統(tǒng),包括MSSQL,,Mysql,Oracle,hdbsql等。它提供了很靈活的配置方式,只需要修改jbpm.properties文件,同時將相應(yīng)的JDBC Driver拷貝到lib目錄就可以了。利用ant的generate.ddl命令,JBPM還支持自動生成用于創(chuàng)建系統(tǒng)表的sql腳本,而且可以生成對應(yīng)于各種數(shù)據(jù)庫系統(tǒng)的腳本,非常便于數(shù)據(jù)庫系統(tǒng)的更換和系統(tǒng)數(shù)據(jù)庫的創(chuàng)建。
5.?? 開發(fā)過程
環(huán)境配置如下:
JBPM 2.0
Ant 1.6.2
Tomcat 5.0.27
SQL Server 2000
SQL Server 2000 Driver for JDBC
仍以之前演示過的request a payraise為例(見下圖),介紹一下利用JBPM開發(fā)一個工作流應(yīng)用需要完成的工作。
1)??????
首先,我們需要完成流程的定義。這不僅包括定義processdefinition.xml,還要對流程執(zhí)行時使用到的其他資源進(jìn)行定義。比如,在web應(yīng)用中用到的圖片,form等。還需要配置form.xml,該文件確定了流程中不同狀態(tài)和form的關(guān)系,如request a payraise狀態(tài)下,需要如下圖所示的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命令,解析這個文件并且將執(zhí)行時需要的信息存儲在數(shù)據(jù)庫中。如下圖:
3)??????
我們無需關(guān)心流程將怎么執(zhí)行,完全交給jbpm.core.jar就好。
4)??????
剩下的另外一項比較繁重的工作就是開發(fā)一個用于該流程的客戶端應(yīng)用。前面已經(jīng)提到過,
我們需要做的主要工作是完成客戶端應(yīng)用所需的
jsp
頁面的開發(fā)。包括登錄頁面,查看自己的
tasklist
頁面,執(zhí)行
task
的頁面等。除此之外,還可以通過日志來完成流程的監(jiān)控和管理界面。這些都由應(yīng)用的需求來決定。