刚刚接触工作流,开始学习,无从下手。
找到了这篇文章,该篇文章作为入门的
JBPM
介绍,还是不错的。
拿来给大家共享( 非原创)
jBPM
介紹
本篇文章引自
:
如果原作者有异议,请联系我,及时删除。
jBPM
是ㄧ款架構在
Java
的
workflow engine
。
工作流程從
XML
定義。
jBPM
本身不含編輯器
,
只要有
jBPM
的
lib
即可
.
屬於輕便的
workflow engine.
需要投入大量時間了解
工作流程語法和理論
.
安裝需求:
jdk-1.5.0_4 ---------- http://java.sun.com/j2se/1.5.0/download.jsp
jbpm starters kit with eclipse 3.0 for Windows ---------- http://sourceforge.net/projects/jbpm/
內涵:
jbpm (version 3.0), jbpm-bpel, jbpm-db(with HSQL), jbpm-designer(with Eclipse 3.0),
jbpm-server(with Jboss)
實際上亦可下載
jbpm
和
Eclipse 3.0
獨立的版本
Jboss jBPM ----------
最基本的
jBPM,
版本為
3.0.1
。
Jboss jBPM Starters kit ----------
與
JBoss jBPM Starters Kit With Eclipse for
Windows
ㄧ樣但是少了
Eclipse
。
JBoss jBPM Process Designer Plugin
----------
若不是下載
starters kit, Eclipse
中要
加入此
plugin
才能使用
Process
Definition
的
圖形介面。
Eclipse 3.0 ---------- http://www.eclipse.org/downloads/index.php
在
jbpm 3.0
當中已備有一個架構在
記憶體
上的資料庫
HSQL,
供測試用。
實際應用上我們在介紹中使用
PostgresSQL,
這個資料庫系統提供資料在硬碟上的存取。
postgresql-8.0.3 ---------- http://www.postgresql.org/download/
postgresql-8.0-312.jdbc3 ---------- http://jdbc.postgresql.org/download.html
執行需求:
本介紹以
Eclipse
為
editor
1.
l
將
jdk-1.5.0_4
安裝後
,
設定環境變數
%JAVA_HOME%
於安裝位置
(for Windows)
。
l
將
jdk-1.5.0_4
安裝後
,
設定環境變數
i.
For
sh / bash
:
export
JAVA_HOME
/
安裝位置
ii.
For
tch / tcsh
:
setenv
JAVA_HOME
/
安裝位置
2.
將
jbpm-starters-kit-with-eclipse-3.0
解壓縮於任意資料夾中。
3.
啟動
*/jbpm-starters-kit-with-eclipse-3.0/jbpm-designer/eclipse/eclipse.exe
,開啟一個新
4.
的
Jave project
。
(
附錄
A)
5.
由於該工作只有
JRE
資源
,
我們還需要將
jbpm-starters-kit-with-eclipse-3.0/jbpm/lib
下所有的
jar
檔引進工作中
,
並將
jbpm-starters-kit-with-eclipse-3.0/jbpm/buld
中
jbpm-3.0.jar
和
jbpm-identity-3.0.jar
引進。
(
附錄
B)
6.
(Optional
:亦可使用
HSQL
。使用
PostgresSQL
是為了模擬實際的應用
)
最後我們架設一個
資料庫。安裝好
postgresql-8.0.3
。於
開始
/
所有程式
/ PostgreSQL 8.0
開啟
start service
。開啟
pgAdmin III (PostgresSQL
前端管理介面
)
並於伺服器選擇連線,待連上後新建資料庫。
重回
Eclipse
,將
jbpm-starters-kit-with-eclipse-3.0/jbpm/src/config.files
引進,改變
hibernate.cfg.xml
中的
jdbc connection properties
,將原本的去除
(
或註解
)
改加上
<property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property>
<property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
<property name="hibernate.connection.url">jdbc:postgresql://localhost/
[Data Base
名稱
]</property>
<property name="hibernate.connection.username">[
你的名稱
]</property>
<property name="hibernate.connection.password">[
你的密碼
]</property>
將
postgresql-8.0-312.jdbc3.jar
引進。如此即完成
jBPM
的架設。
描述語言:
jBPM
將工作寫成
XML
檔,稱為
Process Definition
。
範例:
<
process-definition
name
=
"TicketAndMeal"
>
<!-- SWIMLANES -->
<
swimlane
name
=
"Employee"
>
<
assignment
class
=
"pkg1.assignmentHandler_E"
/>
</
swimlane
>
<
swimlane
name
=
"Cook"
>
<
assignment
class
=
"pkg1.assignmentHandler_C"
/>
</
swimlane
>
<!-- NODES -->
<
start-state
>
<
transition
name
=
"customer"
to
=
"OrderTicketAndMeal"
/>
</
start-state
>
<
task-node
name
=
"OrderTicketAndMeal"
>
<
task
naem
=
"TakeMeal"
swimlane
=
"Employee"
>
<
controller
>
<
variable
name
=
"ticket"
access
=
"read,write"
/>
<
variable
name
=
"meal"
access
=
"read,write"
/>
</
controller
>
</
task
>
<
transition
to
=
"MealDecision"
/>
</
task-node
>
<
decision
name
=
"MealDecision"
>
<
transition
name
=
"no meal"
to
=
"Delivery"
>
<
condition
>
meal == 0
</
condition
>
</
transition
>
<
transition
name
=
"meal"
to
=
"Kitchen"
>
<
condition
>
meal != 0
</
condition
>
</
transition
>
</
decision
>
<
task-node
name
=
"Kitchen"
>
<
task
name
=
"PrepareMeal"
swimlane
=
"Cook"
>
<
controller
>
<
variable
name
=
"meal"
access
=
"read"
/>
</
controller
>
</
task
>
<
transition
to
=
"Delivery"
/>
</
task-node
>
<
task-node
name
=
"Delivery"
>
<
task
name
=
"Deliver"
>
<
assignment
class
=
"pkg1.OrderAssignmentHandler"
/>
</
task
>
<
transition
to
=
"End"
/>
</
task-node
>
<
end-state
name
=
"End"
/>
</
process-definition
>
可以看到,此ㄧ敘述由
<process-definition>
這一個標籤包住
,
裡面有
states
和
nodes
:
State
代表
process instance
在當下的狀態
,
與
UML
所說的
state
類似。
Node
則是所有牽涉外部
(
非
process instance
中
)
的邏輯判斷區塊
,
如
task-node
。
整個
process definition
的結構:
開始:
<start-state>
中間工作:
<task-node>
傳遞:
<transition>
結束:
<end-state>
使用
jBPM
進行
workflow (
工作流程
)
的管理須要
遵守
JPDL
語法。
(
附在
userguide
中
Chapter 13
.
jBPM Process Definition Language (JPDL)
)
各個
node
之間有
transitions
作連結。
Task
是ㄧ個工作
,
可以藉由指派
swimlane
份派工作給擁有同一個角色的不同人。在
swimlane
標籤中說明當需要這個角色時經由一個指定的
class
來分派工作。這個描述在
assignment
中處理。每當工作流程遇上一個
task
,就會進行
assignment
的作業。
(
一個簡單的範例在
$jbpm_HOME/src/java.examples/org/jbpm/tutorial/taskmgmt)
Controller
是控制變數的,當宣告變數時不加任何參數
代表
read/write
皆可,可宣告為
read only
或是
write only
。
(
一個簡單的範例在
$jbpm_HOME/src/java.jbpm.test/org/jbpm/jpdl/xml/TaskControllerXmlTest.java)
Decision
同字面上的
,
是決策機制。裡面可以有多個
transition
到不同的
node
。
Transition
中包含
condition
,作為判斷。
Condition
回傳一個
Boolean
值,為
true
則走向該
transition
所指的下ㄧ個
node
,否則往下ㄧ個
condition
。
(
一個簡單的範例在
$jbpm_HOME/src/java.jbpm.test/org/jbpm/jpdl/exe/DecisionHandlerTest.java
or ./DecisionConditionsTest.java)
上述的流程範例直接解釋為:
此流程定義為
TicketAndMeal
。
ㄧ開始,客人來到櫃檯前想要交易,ㄧ名員工
(Employee)
被指派接待客人。
員工先詢問要客人要買什麼
(ticket or meal)
,客人告知需求後員工提交資料。
判斷:
如果有點
ticket
和
meal
的話,進入
Kitchen
。
否,就進入
Delivery
。
Kitchen
中的
Cook
確認餐數
(meals)
,製作完成後轉向
Delivery
。
Delivery
階段,系統計算出費用。員工確認收到正確金額後轉向
end
常用
API
:
1.
註冊
Process Definition (
流程定義
)
JbpmSessionFactory jbpmSessionFactory =
JbpmSessionFactory.buildJbpmSessionFactory();
InputStream is =
new FileInputStream("testProcessDefinition.xml");
JbpmSession jbpmSession =
jbpmSessionFactory.openJbpmSession();
jbpmSession.beginTransaction();
jbpmSession
.getGraphSession()
.saveProcessDefinition(
ProcessDefinition.parseXmlInputStream(is)
);
jbpmSession.commitTransaction();
jbpmSession.close();
2.
獲得已註冊的
Process Definition
列表
JbpmSessionFactory jbpmSessionFactory =
JbpmSessionFactory.buildJbpmSessionFactory();
JbpmSession jbpmSession =
jbpmSessionFactory.openJbpmSession();
jbpmSession.beginTransaction();
List processDefinitions =
jbpmSession
.getGraphSession()
.findAllProcessDefinitions();
/*
if you want to look at processDefinitions, here we present
showing it on console.
*/
for(int i = 0 ; i < processDefinitions.countItems() ; i++){
System.out.println(processDefinitions.get(i));
}
3.
create process instance
當我們獲得所有的
Process Definition
之後,我們生成一個
Process Instance
以進行指定的
Process Definition
的
workflow
。
ProcessDefinition processDefinition =
jbpmSession
.getGraphSession()
.findLatestProcessDefinition(
processDefinitions.get(*)
);
ProcessInstance processInstance =
new ProcessInstance(processDefinition);
參考:
$jbpm_HOME/src/java.examples/org/jbpm/tutorial/db
/*
‘ * ’
means the Process Definition’s number
In list processDefitions.
*/
4.
獲取
process instance list
生成
Process instance
之後,我們可以藉由以下的
function
幫助我們找尋一
Process Definition
下有哪些
instance
List processInstances =
jbpmSession
.getGraphSession();
.findProcessInstances(*);
/*
‘*’
is a long type which equals the process definition number
in list processDefinitions
*/
參考:
$jbpm_HOME/src/java.examples/org/jbpm/tutorial/db (
在參考中的範例是僅供單機測試
,
不能用於實際情況
)
5.
獲取
task list
Task
是針對一個人在
process definition
中所扮演的角色的工作。
JbpmSessionFactory jbpmSessionFactory =
JbpmSessionFactory.buildJbpmSessionFactory();
JbpmSession jbpmSession =
jbpmSessionFactory.openJbpmSession();
jbpmSession.beginTransaction();
List taskInstances =
jbpmSession
.getTaskMgmtSession();
.findTaskInstances(*);
/*
‘*’
represents the actorID(
角色
) of this task
*/
如此,我們獲得
角色
應有的所有
task
。
參考:
$jbpm_HOME/src/java.examples/org/jbpm/tutorial/taskmgmt (
在參考中的範例是屬於測試
,
不能用在實際情況
)
6.
完成
task
並輸入值
JbpmSessionFactory jbpmSessionFactory =
JbpmSessionFactory.buildJbpmSessionFactory();
JbpmSession jbpmSession =
jbpmSessionFactory.openJbpmSession();
jbpmSession.beginTransaction();
TaskInstance taskInstance=
taskInstances.get(*);
taskInstance.submitParameters(mapvariable);
taskInstance.end();
jbpmSession.commitTransaction();
jbpmSession.close();
/*
‘*’
represents the number of the taskInstance in the list. This approach is based on the previous example, since we would like to view the task lists before we handle it.
Another approach would be assigning ID from jbpmsession, however, that will be a different programming logic.
The method submitParameters(java.util.Map parameter) will transfer data to the process instance scope “ticket” & “meal” by the key name in parameter.
*/
7.
輔助開發工具
Squirrel SQL Client
ㄧ個免費的資料庫前端程式。
設定好
driver
之後
,
可以連上各家的資料庫。排版上和資料編排上較人性。
Java Based
。
PostgresSQL
的使用小秘方
在開發中的
workflow
系統時常需要將
table
ㄧ再重新輸入
資料庫。
有一個方法可以在不銷毀
資料庫
下清除內部資料:
開啟
PostgresSQL
後選擇ㄧ資料庫。
選工具
/
查詢工具
(
或是
menu
上的筆狀圖示
)
工具在:
%jBPM starterkit eclipse_HOME%/jbpm-db/build/script
clear
:毀資料
drop.create
:毀掉
table
後重建
drop
:消滅
creat
:建立
table
如此
,
我們不必在註冊時說明建立
table
。
(
這個功能只有在
jbpm-db
中有
,
其
table
是根據
jBPM
的需要建立
)
Eclipse
中的
process definition
圖形介面
因目前處於開發階段,該圖形介面能夠提供的功能不多。只能畫出基本架構,無法做出更精密的控制
安裝方式:
下載
JBoss jBPM Process Designer Plugin
後
,
將
plugin
資料夾的所有檔案複移到
$Eclipse_HOME/plugin/
下。
開啟的方式:
從
project
中
新增
à
other
à
JBOSS jBPM
à
Process Definition
使用方法:
開啟後會出現一個
*.par
的
folder
,點開後左下方有
diagram
和
sorce
。從
diagram
中可以拉工具繪製,
sorce
中可以用手寫的方式更動。
使用心得:
此圖形介面立意雖好
,
但是無法做出更進ㄧ步控制。例如:
controller,
而且
task
並沒有顯示在
task-node
標籤下。如果使用者直接貼上
code,
圖形產生器可能無法建立
process definition graph
。使用起來起來相當不方便
8.
網站手冊以及資源
jBPM userguid off-line
:
%JBPM_HOME%/doc/userguide/en
開啟
index.html