1、新建項目<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
主菜單“文件->新建->項目”,在彈出的對話框裏,選中JBoss jbpm節點下的“ Process Project ”項。輸入項目名:JbpmProject,項目建好後結構如圖所示:
<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 189.75pt; HEIGHT: 277.5pt" type="#_x0000_t75"><imagedata o:title="TestJbpm2結構圖" src="file:///C:%5CDOCUME~1%5CUSER%5CLOCALS~1%5CTemp%5Cmsohtml1%5C13%5Cclip_image003.jpg"></imagedata></shape>
這個項目和通常 Eclipse 的項目結構有點不同,不過 這是一個現在非常流行的項目結構, src/java 存放源文件, test/java 存放相應的 JUnit 單元測試代碼。
下面介紹一下各個文件:
l MessageActionHandler ,自動生成的一個 ActionHandler 。不想要可以刪掉。
l ehcache.xml cache 的配置文件,裏面有很詳解的英文說明。沒有必要可以不用改它。
l hibernate.cfg.xml jBPM 是用 Hibernate 進行工作流的數據存儲的,這個就是 Hibernate 的配置文件。後面我們將講到如何配置這個文件。
l jbpm.cfg.xml jbpm 本身的配置文件。現在是空的,它用的是缺省配置,你想知道有哪些配置就去看這個文件E:\software\jbpm-starters-kit-3.1.2\jbpm\src\java.jbpm\org\jbpm\default.jbpm.cfg.xml
l log4j.properties 這個是日誌 API 包 log4j 的配置文件,用過 log4j 的都知道。
l SimpleProcessTest.java 這個是對最重要的流程配置文件的 processdefinition.xml 單元測試代碼。這裏表揚一點, jBPM 的優良設計使得它的可測試性非常之高,喜歡寫 t 單元測試的人有福了。
l gpd.xml 用於生成流程圖的定義文件。都是一些方框的座標和長寬
l processdefinition.xml 這個是對最重要的流程配置文件,以後寫流程要經常和它打交道。
l processimage.jpg 一個流程圖
2、修改hibernate.cfg.cml配置文件
hibernate.cfg.xml 的默認設置是用 HSQL ,這是一個內存數據庫,這種內存數據庫用來代替項目實際所用的數據庫來做單元測試挺不錯的。
注:配置值可參考jbpm-starters-kit-3.1.2\jbpm-db 對應子目錄下的 hibernate.properties 文件。
一、網上朋友給我mysql與oracle的配置如下:
1 、 MySQL 的更改如下:
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/jbpm</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123456</property>
2 、 Oracle 的更改如下:
<property name="hibernate.dialect">org.hibernate.dialect.OracleDialect</property>
<property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<property name="hibernate.connection.url">jdbc:oracle:thin:@192.168.123.10:1521:wxxrDB</property>
<property name="hibernate.connection.username">chengang</property>
<property name="hibernate.connection.password">chengang</property>
如果你裝了 Oracle 的客戶端,並且 D:\oracle\ora92\network\ADMIN\tnsnames.ora 裏做了如下的設置
WXXRDB_192.168.123.10 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.123.10)(PORT = 1521))
)
(CONNECT_DATA =
(SID = wxxrDB)
(SERVER = DEDICATED)
)
)
則 Oracle 的 hibernate.connection.url 項也可以設爲: jdbc:oracle:oci:@WXXRDB_192.168.123.10
二、我的配置修改
1、sqlserver
<!-- hibernate dialect -->
<property name="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</property>
<!-- JDBC connection properties (begin) -->
<property name="hibernate.connection.driver_class">net.sourceforge.jtds.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:jtds:sqlserver://localhost:1433/jbpm</property>
<property name="hibernate.connection.username">sa</property>
<property name="hibernate.connection.password">admin</property>
<!-- JDBC connection properties (end) -->
3、完善庫引用
主要是把你所用的數據庫的 JDBC 庫引用進來,如果你是下載的jbpm-starters-kit-3.1.2可能還要把 Hibernate 的 hibernate3.jar 加入到項目的庫引用中。
4、開始流程
這裏是一個很簡單的請假流程,請假人提交假單給經理審批,經理審批後結束。
1 、定義流程
流程的定義文件是 processdefinition.xml ,這個是一個關鍵文件, jBPM 的很大一部份內容都是關於它的。在這裏我們把原來自動生成的內容,稍做改動:
<?xml version="1.0" encoding="UTF-8"?>
<process-definition
xmlns="urn:jbpm.org:jpdl-3.2"
name="helloworld">
<!-- 申請 -->
<start-state name="request">
<task>
<controller>
<variable name="name"/>
<variable name="day"/>
<variable name="note"/>
</controller>
</task>
<!-- 流程轉向 -->
<transition name="to_confirm" to="confirm">
<action name="requestAction" class="com.stt.jbpm.RequestAction">
<reason>我要請假</reason>
</action>
</transition>
</start-state>
<!-- 審批 -->
<state name="confirm">
<transition name="to_end" to="end">
<action name="finishAction" class="com.stt.jbpm.ConfirmAction"/>
</transition>
</state>
<!-- 結束 -->
<end-state name="end"></end-state>
</process-definition>
說明:
流程的名稱改成了 helloworld 。(呵呵,也就是這裏和 helloworld 有關了)
<controller> 標籤定義了三個數據:姓名、請假天數、說明。
<transition> 標籤定了 request 節點的一個流程轉向,這裏是轉到 confirm 節點。
<action> 標籤定義了流程由一個節點轉到另一個節點時,所要執行的動作,動作封裝在一個 ActionHandler 類中。比如這裏當 request 到 confirm 結點時將執行 RequestAction 類的 execute 方法。
RequestAction下面還有一個 <reason> (請假理由),它對應於RequestAction 的屬性 String reason 。
5、編寫 ActionHandler
在上面 processdefinition.xml 裏我們定義了兩個 ActionHandler : RequestAction 、 ConfirmAction 。其代碼如下:
package com.stt.jbpm;
import org.jbpm.graph.def.ActionHandler;
import org.jbpm.graph.exe.ExecutionContext;
public class RequestAction implements ActionHandler {
private static final long serialVersionUID = 1L;
private String reason;
@Override
public void execute(ExecutionContext context) throws Exception {
context.getContextInstance().setVariable("note", reason);
}
public String getReason() {
return reason;
}
public void setReason(String reason) {
this.reason = reason;
}
}
說明: ExecutionContext 是一個貫通流程的容器。它是個大寶箱,裏面啥玩意都有,後面將更深入的提到。這裏的 reasion 就是 processdefinition.xml 中的 ” 我要請假 ”
package com.stt.jbpm;
import org.jbpm.graph.def.ActionHandler;
import