- 論壇徽章:
- 0
|
jbpm入門例子
[url=javascript:d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(saveit=window.open('http://wz.csdn.net/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'saveit','scrollbars=no,width=590,height=300,left=75,top=20,status=no,resizable=yes'));saveit.focus();]收藏[/url]
新一篇: windows下svn-1.4.0環(huán)境布置和eclipse集成
1. jBPM的簡單介紹
jBPM是JBOSS下的一個開源java工作流項(xiàng)目,該項(xiàng)目提供eclipse插件,基于Hibernate實(shí)現(xiàn)數(shù)據(jù)持久化存儲。
參考
http://www.jboss.com/products/jbpm
2. jBPM和myeclipse的沖突
當(dāng)eclipse安裝了myeclipse和jBPM時候,可能有沖突,具體表現(xiàn)在jBPM的流程設(shè)計(jì)器不能在eclipse中使用。
3. Hibernate連接mysql數(shù)據(jù)庫的一般參數(shù)
下面的配置參數(shù),根據(jù)需要可以修改:
jbpmtest是mysql中的schema的名字;
GBK是字符集,可以根據(jù)需要修改;
username=root,mysql數(shù)據(jù)庫的用戶名是root;
password=mysql,mysql數(shù)據(jù)庫的用戶密碼是mysql;
hibernate.dialect=org.hibernate.dialect.MySQLDialect
hibernate.connection.driver_class=com.mysql.jdbc.Driver
hibernate.connection.url=jdbc:mysql://localhost/jbpmtest?useUnicode=true&characterEncoding=GBK
hibernate.connection.username=root
hibernate.connection.password=mysql
hibernate.show_sql=true
hibernate.c3p0.min_size=1
hibernate.c3p0.max_size=3
4. Hibernate連接Oracle數(shù)據(jù)庫的一般參數(shù)
hibernate.dialect=org.hibernate.dialect.Oracle9Dialect
hibernate.connection.driver_class=oracle.jdbc.driver.OracleDriver
hibernate.connection.url= jdbc:oracle:thin:@localhost:1521:orcl hibernate.connection.username=jbpm
hibernate.connection.password=jbpm
5. 為jBPM創(chuàng)建數(shù)據(jù)庫表等內(nèi)容
5.1. 為mysql創(chuàng)建數(shù)據(jù)庫以及數(shù)據(jù)內(nèi)容
JbpmSessionFactory.buildJbpmSessionFactory().getJbpmSchema().dropSchema();
JbpmSessionFactory.buildJbpmSessionFactory().getJbpmSchema().createSchema();
這2個語針對mysq有效.
5.2. 為oralce創(chuàng)建數(shù)據(jù)庫以及數(shù)據(jù)內(nèi)容
JbpmSessionFactory.buildJbpmSessionFactory().getJbpmSchema().dropSchema();
JbpmSessionFactory.buildJbpmSessionFactory().getJbpmSchema().createSchema();
上面的語句對oralce無效。
模型目錄jBPM\jbpm_database\jBPM_oralce10g.pdm 是jBPM的Oralce模型,包含對應(yīng)的Sequence的信息.
需要在數(shù)據(jù)庫中創(chuàng)建 Sequence name=hibernate_sequence
http://wiki.jboss.org/wiki/Wiki.jsp?page=JbpmOnOracle
5.3. 流程信息保存到數(shù)據(jù)庫
JbpmSessionFactory factory = JbpmSessionFactory.buildJbpmSessionFactory();
JbpmSession session = factory.openJbpmSession();
GraphSession graphSession = session.getGraphSession();
session.beginTransaction();
/// new ProcessDefinition 實(shí)例
ProcessDefinition myProcessDefinition = null;
ProcessInstance processInstance = new ProcessInstance(processDefinition);
processInstance.getContextInstance().setVariable("myvar","xxx");
///
graphSession.saveProcessDefinition(myProcessDefinition);
session.commitTransaction();
session.close();
jBPM和Hibernate,MySQL的使用中會遇到字符集的問題.
需要注意幾個地方。
5.4. 在Mysql安裝過程指定字符集
在Mysql安裝過程中指定相應(yīng)的默認(rèn)字符集是GBK
5.5. Hibernate.properties文件中的字符集設(shè)置
hibernate.connection.url=jdbc:mysql://localhost/jbpmtest?useUnicode=true&characterEncoding=GBK
5.6. hibernate.cfg.xml 文件中的字符集設(shè)置
property name="hibernate.connection.url">jdbc:mysql://192.168.1.2/jbpmtest
5.7. MySQL的配置文件的修改:
my.ini中 default-character-set=GBK
注意有2處需要修改
6. 為流程定義變量
分成3種流程變量
全局變量(全局流程變量)
全局臨時變量(全局流程臨時變量)
局部變量(流程某個接點(diǎn)內(nèi)有效的變量)
@see org.jbpm.context.exe.ContextInstance
目前還沒有使用過局部變量(流程某個接點(diǎn)內(nèi)有效的變量)
流程變量的定義
6.1. 流程變量的類型
· java.lang.String
· java.lang.Boolean
· java.lang.Character
· java.lang.Float
· java.lang.Double
· java.lang.Long
· java.lang.Byte
· java.lang.Short
· java.lang.Integer
· java.util.Date
· byte[]
· java.io.Serializable
· classes that are persistable with hibernate
所有基本類型的包裹類型,以及實(shí)現(xiàn)了Serializable的類型都可以作為流程參數(shù)變量使用,注意參數(shù)類不能是一個類的內(nèi)部類或者屬性類(除非包含參數(shù)類的類實(shí)現(xiàn)了Serializable接口)
參考 org.jbpm.context.exe.VariableInstance
6.2. 流程變量的使用
l 變量的定義和獲取
void ContextInstance.setVariable(String variableName, Object value);
void ContextInstance.setVariable(String variableName, Object value, Token token);
Object ContextInstance.getVariable(String variableName);
Object ContextInstance.getVariable(String variableName, Token token);
l Variables can be deleted with
ContextInstance.deleteVariable(String variableName);
ContextInstance.deleteVariable(String variableName, Token token);
6.3. Variable lifetime
一個變量在被定義后,在變量從ContextInstance刪除前,都可以被訪問。當(dāng)變量被刪除后,去獲取該變量將返回為空。
6.4. 自定義類的實(shí)例作為流程變量
如果一個類的實(shí)例要作為流程變量使用,該類需要實(shí)現(xiàn)java.io.Serializable接口,并且定義序列化版本.
//一個可以作為流程變量使用的類
class Wdz implements Serializable{
//為類指定序列化版本號
private static final long serialVersionUID = 1L;
private String name="wdz";
private int age=10;
public String toString(){
return "name="+name+",age="+age;
}
}
上面的例子中,如果把類Wdz作為類WdzParent內(nèi)部類使用,然后當(dāng)成流程變量使用,那類WdzParent必須 也實(shí)現(xiàn)Serializable接口,否則會有問題.
6.5. Transient variables
流程的歷史變量是不能持久化的,作用范圍是對整個流程全局有效的。
在ContextInstance類內(nèi)部,采用的是一個Map來存儲TransientVariable的信息
參考代碼
org.jbpm.context.exe.ContextInstance 的源代碼。
主要的相關(guān)方法
public void deleteTransientVariable(java.lang.String name)
public void setTransientVariable(java.lang.String name,
java.lang.Object value)
public java.lang.Object getTransientVariable(java.lang.String name)
6.6. Variables overloading
當(dāng)一個變量和流實(shí)例關(guān)聯(lián)(變量名字=”wdz”,value=”test”),如果在設(shè)置一個變量
(變量名字=”wdz”,value= new Integer(10)) ,那最后變量(變量名字=”wdz)的值是Integer(10)。
這稱之為overload.
6.7. Variables overriding
如果父流程有變量A(值=”value1”),子流程又定義了變量A值=”value2”,那在子流程范圍內(nèi),獲取變量A的值,那結(jié)果是值=”value2”。這是遵循一般語言的局部變量在它的局部范圍內(nèi)override上級變量。
6.8. 流程變量的持久化
它依賴于流程實(shí)例的持久化,非TransientVariable隨流程實(shí)例的持久化一起被保存。
保存在數(shù)據(jù)表jbpm_variableinstance
參考 org.jbpm.context.exe.VariableInstance
6.9. Customizing variable persistence (可以進(jìn)一步了解)
User java object converter variable instance
也就是自定義類的持久化需要定義自己的converter和變量實(shí)例類
converter和變量實(shí)例類需要繼承org.jbpm.context.exe.VariableInstance
converter需要實(shí)現(xiàn)org.jbpm.context.exe.Converter接口
一
工作流雖然還在不成熟的發(fā)展階段,甚至還沒有一個公認(rèn)的規(guī)范標(biāo)準(zhǔn)。但其應(yīng)用卻已經(jīng)在快速展開,這說明市場對工作流框架的需求是急迫而巨大的。
我們公司的后臺短信管理系統(tǒng)涉及短信編發(fā)、領(lǐng)導(dǎo)層層審核等操作,這是一個比較典型的工作流系統(tǒng)。過去我們用的工作流引擎是 shark ,然后在使用后發(fā)現(xiàn)其過于龐大,后臺數(shù)據(jù)庫操作頻繁而未進(jìn)行優(yōu)化,直接導(dǎo)致的后果就是前臺操作緩慢。于是經(jīng)研究決定,將工作流引擎由 shark 換成 jBPM 。
jBPM 之前是一個開源軟件,后加入 JBoss 組織。正好我們公司也是用 JBoss 的。不過 jBPM 并沒有綁定在 JBOSS 上, Tomcat 等也可以使用它。
jBPM 的正處在不斷發(fā)展中,做為開源軟件的特點(diǎn),其設(shè)計(jì)變化往往很大。所以一些過去的資料可能已經(jīng)不適用了。于是作者根據(jù)自己的使用經(jīng)驗(yàn),重新整理出這份文檔,以備學(xué)習(xí)參考。
注:本文使用的 jBPM 版本為 3.1.1
環(huán)境準(zhǔn)備
1、安裝JDK
所有 JAVA 開發(fā)第一個需要安裝的,沒什么好說的。記得把系統(tǒng)變量 JAVA_HOME 設(shè)上。
2、安裝Ant
Ant 是使用 jBPM 必須的一個工具。 jBPM 中的很多操作都要用到 Ant 。
安裝方法:
( 1 )先下載:
http://archive.apache.org/dist/ant/binaries/
,選一個如: apache-ant-1.6.5-bin.zip 。
( 2 )解壓到 D:\ant (當(dāng)然其他目錄也可以)。
( 3 )設(shè)置如下系統(tǒng)變量: ANT_HOME=d:\ant 。
( 4 )把 %ANT_HOME%\bin 加入到系統(tǒng)變量 PATH 中。
3、安裝Eclipse
Eclipse 不是開發(fā) jBPM 必須的工具,但它是對 jBPM 開發(fā)很有幫助的工具,特別是 jBPM 提供了一個 Eclipse 插件用來輔助開發(fā) jBPM 。關(guān)于 Eclipse 的安裝不贅述了,本文用的版本是: Eclipse3.2
安裝 jBPM
jBPM 的下載地址:
http://www.jboss.com/products/jbpm/downloads
l JBoss jBPM 是 jBPM 的軟件包
l JBoss jBPM Starters Kit 是一個綜合包,它包括了 jBPM 軟件包、開發(fā)插件、一個配置好了的基于 JBoss 的 jBPM 示例、一些數(shù)據(jù)庫配置文件示例。
l JBoss jBPM Process Designer Plugin 是輔助開發(fā) jBPM 的 Eclipse 插件。
l JBoss jBPM BPEL Extension jBPM 關(guān)于 BPEL 的擴(kuò)展包
本指南選擇下載: JBoss jBPM Starters Kit 。下載后解壓到 D:\jbpm-starters-kit-3.1 ,目錄下含有五個子目錄:
l jbpm jBPM 的軟件包
l jbpm-bpel 只含有一個網(wǎng)頁
l jbpm-db 各種數(shù)據(jù)庫 hibernate 配置文件示例,有些還包含了相應(yīng)的 jdbc 驅(qū)動程序。
l jbpm-designer 輔助開發(fā) jBPM 的 Eclipse 插件,具體在 jbpm-gpd-feature 子目錄中
l jbpm-server 一個已經(jīng)配置好了的基于 JBoss 的 jBPM 示例 .
感覺下工作流
前面我們說了,在 JBoss jBPM Starters Kit 的 jbpm-server 目錄是一個已經(jīng)配置好的了 jBPM 示例,那么讓我們來感覺一下 jBPM 做出的東西吧。
雙擊 jbpm-server 目錄下的 start.bat 文件,啟動 JBoss 服務(wù)。這時會打開一個 DOS 窗口,啟動完成后,日志會不斷輸出,其中最后一句是“ 13:55:39,937 DEBUG [StaticNotifier] going to wait for (CMD_EXECUTOR, java.lang.Object@1df59bd) ”,這表示 jBPM 在開始工作了,它不斷進(jìn)行輪詢。
打開網(wǎng)頁:
http://localhost:8080/jbpm/
得到如下畫面
![]()
這是一個已經(jīng)用 jBPM 開發(fā)好的用戶定單流程,具有下單、審核、估價等流程。它所用的數(shù)據(jù)庫是一個內(nèi)置的數(shù)據(jù)庫。
以 cookie monster 用戶登錄,選擇“ create new web sale order ”可以創(chuàng)建一個定單。如下圖所示,在圖左邊是填寫的定單情況,右邊一整個定貨流程的示意圖,紅色框表示流程進(jìn)行到哪一步了。填寫好定單好,選擇“ Save and Close Task ”,完成定單提交。
![]()
選擇右上角的“ Login as another user ”以另外一個用戶名 ernie 登錄。這時可以看到 ernie 用戶的任務(wù)列表中多了一項(xiàng)。
![]()
點(diǎn)進(jìn)去后,顯示如下畫面。這個示例對中文的支持不好,全都顯示成了 unicode 碼了。不管這什么多,反正知道是這么回事就行了。在 comment 項(xiàng)填寫意見,選 OK 按鈕,進(jìn)入到下一步。如果選擇 more info needed 按鈕,則打回給 cookie monster 用戶修改定單。
![]()
下面的流程,這里就不再贅述了。在這個很標(biāo)準(zhǔn)的工作流示例中,我們基本可以看到 jBPM 的應(yīng)用范圍還是比較廣的。而且從這個示例,我們是看不出有 jBPM 的,也就是說 jBPM 在后臺起著作用。
從這個例子,還看不出 jBPM 的優(yōu)勢。不過,如果在一個流程不確定,經(jīng)常需要變動的項(xiàng)目中, jBPM 的好處將會顯然出來。應(yīng)用 jBPM 后,改變流程只需改變流程描述文件,這將在后面的內(nèi)容提到。
這是一個已做好的示例,接下來我們將仿造這個實(shí)例來開發(fā)一個請假流程。
4 數(shù)據(jù)庫初始化
jBPM 需要數(shù)據(jù)庫支持, jBPM 會把自己的一個初始化數(shù)據(jù)存儲到數(shù)據(jù)庫,同時工作流的數(shù)據(jù)也是存儲到數(shù)據(jù)庫中的。 jBPM 使用 Hibernate 來做為自己的存儲層,因此只要是 Hibernate 支持的數(shù)據(jù)庫, jBPM 也就支持。
本文先以 MySQL 為例,然后再以 Oracle 為例,來談?wù)?jBPM 的數(shù)據(jù)庫初始化操作。
注:在上面的 JBoss 自帶的示例中,并沒有設(shè)置數(shù)據(jù)庫,那是因?yàn)?jBPM 默認(rèn)使用的是內(nèi)存數(shù)據(jù)庫 hsqldb 。
4.1 MySQL
1 、首先安裝 MySQL 。
MySQL 的安裝比較簡單,網(wǎng)上也有很多文章,本文不再贅述。本指南所用 MySQL 版本為 MySQL 4.1 ( for windows )。再找一個 MySQL 客戶端,目的是方便查看數(shù)據(jù)庫中的數(shù)據(jù),本文推薦使用 MySQL 網(wǎng)站上免費(fèi)提供的“ MySQL Query Brower ”,當(dāng)然你用其他的客戶端也行,比如 MySQL-Front 。
2 、建庫
MySQL 中創(chuàng)建一個庫,庫名: jbpm
3 、生成建表的 SQL 語句并建表
將 jbpm-starters-kit-3.1.1 下的子目錄 jbpm 改名為 jbpm.3 ,否則在執(zhí)行下面的 ant 命令時會報如 jbpm.3 目錄不存在的錯誤:
D:\jbpm-starters-kit-3.1.1\jbpm-db\build.xml:361: The following error occurred while executing this line:
D:\jbpm-starters-kit-3.1.1\jbpm-db\build.xml:68: Basedir D:\jbpm-starters-kit-3.1.1\jbpm.3 does not exist
在 DOS 窗下,進(jìn)入 D:\jbpm-starters-kit-3.1.1\jbpm-db 目錄,執(zhí)行如下命令:
ant mysql.scripts
執(zhí)行成功后,在 D:\jbpm-starters-kit-3.1.1\jbpm-db\build\mysql\scripts 目錄里生成了四個 sql 文件,它們做什么用的一看名字就知道了。在 MySQL 客戶端中執(zhí)行“ mysql.create.sql ”腳本,這樣將在 jbpm 庫中創(chuàng)建一個個的數(shù)據(jù)表。
4.2 Oracle
先安裝好 Oracle 服務(wù)器。我們公司有現(xiàn)存的 Oracle 服務(wù)器,也提供給了我一個屬于我自己的用戶名,一登錄就可以任意在我的庫之下創(chuàng)建表了。所以這一步就省了,沒有的自個先裝好吧。
訪問 Oracle 推薦用“ PLSQL Developer ”。不過要連接 Oracle 還要在本機(jī)上裝上 Oracle 自己的客戶端程序,里面提供了 JDBC 包和一些配置。要連接服務(wù)器還得配置一下,我一般都是不用 GUI 而直接改 tnsnames.ora 文件,在我的電腦里此文件的目錄地址是: D:\oracle\ora92\network\ADMIN\tnsnames.ora ,內(nèi)容如下 ( 兩面有兩個配置了 ) :
# TNSNAMES.ORA Network Configuration File: E:\oracle\ora92\network\admin\tnsnames.ora
# Generated by Oracle configuration tools.
WXXRDB_192.168.3.2 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.2)(PORT = 1521))
)
(CONNECT_DATA =
(SID = wxxrDB)
(SERVER = DEDICATED)
)
)
WXXRDB_192.168.4.2 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.4.2)(PORT = 1521))
)
(CONNECT_DATA =
(SID = wxxrDB)
(SERVER = DEDICATED)
)
)
前面都是 Oracle 的一些知識,不會的 Google 一下吧。最后配置好后,用 PLSQL Developer 輸入你的用戶名和密碼聯(lián)接到 Oracle ,就算 OK 了。
參考上面 MySQL 的步驟,基本一樣:
(1) 將 jbpm 改名為 jbpm.3 (或者修改jbpm-db目錄下的build.properties文件)
(2) 再執(zhí)行 ant oracle.scripts
(3) 用 jbpm-db\build\oracle\scripts 目錄的 oracle.create.sql 腳本,在 Oracle 中生成 jBPM 的所有表。在“ PLSQL Developer ”中可以新建一個 Command Windows 窗口然后輸入命令: @D:\jbpm-starters-kit-3.1.1\jbpm-db\build\oracle\scripts\oracle.create.sql
(如果報錯,就將報錯的地方注釋掉)
本文來自ChinaUnix博客,如果查看原文請點(diǎn):http://blog.chinaunix.net/u1/50157/showart_1019604.html |
|