還沒(méi)進(jìn)行實(shí)際實(shí)踐,只是就個(gè)人理解對此部分進(jìn)行翻譯,肯定會(huì )有很多疏漏錯誤地方,希望諒解:
同時(shí)希望各位給予寶貴意見(jiàn)。謝謝!互相學(xué)習。接下來(lái)會(huì )進(jìn)一步把實(shí)踐部分補上,同時(shí)對錯誤地方進(jìn)行補充說(shuō)明。
下面開(kāi)始學(xué)習jbpm的tutorial部分的學(xué)習。
1、介紹部分:
JBpm是一個(gè)工作流管理系統。下面的use case圖顯示在jbpm和所有參與者之間調用關(guān)系。
《use case 圖》可以參看jbpm站點(diǎn)上的圖
《use case 圖》可以參看jbpm站點(diǎn)上的圖
《use case 圖》可以參看jbpm站點(diǎn)上的圖
工作流管理系統針對不同人員具有完全不同的含義,下面將具體解釋工作流管理系統四個(gè)層次上的核心職責。
Jbpm以process archives 作為輸入,一個(gè)process archive是一種業(yè)務(wù)流程的規則描述。在一個(gè)process archive被部署以后,jbpm就能夠管理這個(gè)流程的具體執行。“管理執行”的意思是指追蹤流程狀態(tài)(狀態(tài)層次);存儲流程執行的信息;集成或者定制程序的邏輯例如發(fā)email,與ERP系統整合(程序邏輯層);允許用戶(hù)通過(guò)提交表單形式完成任務(wù)(用戶(hù)接口層)。
主要職責:一個(gè)工作流系統的主要職責就是維護過(guò)程執行中的狀態(tài)。Jbpm的狀態(tài)模型以圖形形式表現,它的主要成員就是節點(diǎn)和變遷(不知道翻譯的對不對,參考一些書(shū)中petri net的翻譯),一個(gè)狀態(tài)是一個(gè)節點(diǎn)的樣本。
運行時(shí)交互(runtime interaction):重要的交互包括:開(kāi)始一個(gè)過(guò)程定義的實(shí)例和發(fā)出狀態(tài)結束的信號。這兩種jbpm交互的結果是計算出過(guò)程實(shí)例的下一個(gè)狀態(tài)。
Action:狀態(tài)圖,提供業(yè)務(wù)流程的結構,Action是程序邏輯的一些區塊(部分),程序邏輯被執行在流程中的事件之上,有三種類(lèi)型事件:進(jìn)去一個(gè)節點(diǎn),離開(kāi)一個(gè)節點(diǎn),進(jìn)行一次變遷,當jbpm計算下一個(gè)狀態(tài)時(shí)候,一些事件被觸發(fā)。
Process archives:主要有用的文件就是processdefinition.xml。分析這個(gè)文件和存儲它在數據庫中的動(dòng)作叫做部署一個(gè)流程。前面有所介紹,這里就不多介紹了。
接下來(lái)是介紹一個(gè)創(chuàng )建process archive的例子。很容易就可以看到,只要看過(guò)一些petri net知識的。
2、部署 process archive:
Jbpm把過(guò)程定義存儲在數據庫中。所以部署一個(gè)過(guò)程到jbpm中事實(shí)上也就是意味著(zhù)分析過(guò)程定義文件processdefinition.xml并且把它存儲到jbpm數據庫中??梢酝ㄟ^(guò)兩種方式完成:
1、 運行ant 任務(wù)deploypar通過(guò)文件集合(如processdefinition.xml還有其他from文件)創(chuàng )建Process archive,deploypar部署一個(gè)process arhive到數據庫,deploypar從jbpm.properties中獲取相關(guān)屬性值。這個(gè)文件主要描述jbpm的配置選項,其中包括數據庫(process archive部署到的數據庫),更多關(guān)于此文件(jbpm.properties)的信息請參看配置部分。另外自己加一點(diǎn)小說(shuō)明,可以參看build.xml文件里,targer name=“deploy.process.archives”部分。哪里有上面的script,包括引入的屬性文件以及部署所包含的文件。
2、 通過(guò)程序來(lái)進(jìn)行部署
代碼如下:
// create a process archive input streamString resource = "payraise/processdefinition.xml";InputStream is = PayRaiseTest .class .getClassLoader() .getResourceAsStream(resource);ArchiveBuilder ab = new ArchiveBuilder(is);JarInputStream jis = ab.getJarInputStream(); // deploy the processDefinitionService ds = JbpmServiceFactory .getInstance() .openDefinitionService();ds.deployProcessArchive(jis);ds.close();
雖然上面代碼還沒(méi)看懂,大致先知道有這么一回事吧。
需要注意的是:這代碼也是用到jbpm.properties這個(gè)配置文件,包括數據庫部分。
重點(diǎn):默認狀態(tài)下,jbpm配置到內存數據庫中,這樣只是為了方便進(jìn)行測試,但是當你用ant task部署流程時(shí)候,這似乎沒(méi)有什么太大作用,在這種情況下,你的數據庫就在你的運行時(shí)內存中。所以只有在ant task完畢時(shí)才可以進(jìn)入部署結果。
3、 開(kāi)啟一個(gè)流程實(shí)例
在打包和部署之后,下面的顯示的代碼是教你如何啟動(dòng)一個(gè)流程實(shí)例:
ExecutionService executionService = JbpmServiceFactory.getInstance().openExecutionService("AlbertEinstein");executionService.startProcessInstance( "payraise" );executionService.close();
4、 獲取任務(wù)列表
一個(gè)token是一個(gè)狀態(tài)的指針,在jbpm中,每個(gè)token能指向一個(gè)參與者,因此也就創(chuàng )建了在參與者和狀態(tài)之間的關(guān)聯(lián)。在這個(gè)token思想(state-actor)背后:當引擎開(kāi)始一個(gè)狀態(tài),那就意味著(zhù)工作流引擎正在等待某些額外的觸發(fā)機制。如果流程定義已經(jīng)被弄好了,那這時(shí)就會(huì )計算決定正在等待誰(shuí)來(lái)執行操作,當token進(jìn)入一個(gè)狀態(tài)時(shí)候,這個(gè)計算就會(huì )被執行,所以任務(wù)里列表將是tokens(涉及到一個(gè)指定的參與者)的集合,在jbpm中參與者總是會(huì )以actorid(java.lang.string)來(lái)進(jìn)行識別。
下面代碼顯示了獲取任務(wù)列表的coding :
// get an execution service for user Carl Gauss (cg)ExecutionService executionService = JbpmServiceFactory.getInstance().openExecutionService("cg");// get the task list for Carl Gauss (cg)Collection tasks = executionService.getTaskList("cg");executionService.close();
5、 結束狀態(tài)信號量
當流程實(shí)例被啟動(dòng)后,jbpm計算下一個(gè)狀態(tài)以及負責此任務(wù)的責任人(參與者),流程中的計算token運行的結果是安排下一個(gè)參與者執行任務(wù),接下來(lái)jbpm就會(huì )告訴系統所有的token都在等待這個(gè)得到任務(wù)的參與者,在例子中我們假定第一個(gè)任務(wù)就是我上面啟動(dòng)的的那個(gè)。(他們只是方面大家理解才舉的這個(gè)例子)。當這個(gè)參與者做了決定,他會(huì )通過(guò)調用一個(gè)方法名為endOfState來(lái)通知jbpm。
一個(gè)結束狀態(tài)信號量代碼:
ExecutionService executionService = JbpmServiceFactory.getInstance().openExecutionService("CarlGauss");Collection tasks = executionService.getTaskList("CarlGauss");Token token = (Token) tasks.iterator().next();executionService.endOfState( token.getId(), "approve" );executionService.close();
6、 包含一個(gè)action
Jbpm另外一個(gè)重要的方面就是在過(guò)程定義中包含actions,一個(gè)action是一斷java 代碼。這些代碼必須在某個(gè)過(guò)程事件之上被執行。假設當一個(gè)例子流程啟動(dòng)后你想發(fā)個(gè)消息“message in a bottle”,你將寫(xiě)代碼發(fā)送此消息作為一個(gè)actionhandler。
public class ExampleActionHandler implements ActionHandler {
public void execute(ExecutionContext executionContext) {
System.out.println( "message in a bottle" );
}
}
example action handler code
然后我們能創(chuàng )建在一個(gè)離開(kāi)開(kāi)始狀態(tài)的transtion(變遷)之上的一個(gè)action。
...<start-state name="start"> <transition to="only state"> <action><delegation class="org.jbpm.example.ExampleActionHandler" /></action> </transition></start-state>...作為最最基本的,有3種事件類(lèi)型(action可以被放置):進(jìn)行一個(gè)變遷,進(jìn)入一個(gè)節點(diǎn),離開(kāi)一個(gè)節點(diǎn)。
7、 聲明一個(gè)變量
一個(gè)變量是一個(gè)在數據庫中的持久文本域,所以當想設置一個(gè)變量時(shí)候,jbpm不得不知道怎樣轉換對象成文本,對于下面的類(lèi)型,jbpm知道如何自動(dòng)轉換,它們是:
Java.lang.string
Java.lang.long
Java.lang.date
Java.lang.double
Java.io.serializable
這些變量類(lèi)型在processdefinition.xml中不必聲明。Jbpm利用一個(gè)hashmap的東西來(lái)創(chuàng )建這些變量。
如果你想存儲其他java類(lèi)型的變量,那么你就必須在processdefition.xml中定義一個(gè)serializer。如此:
...
<type java-type="org.jbpm.impl.YourCustomJavaType">
<delegation class="org.jbpm.impl.YourCustomSerializer" />
</type>
...
jpdl-fragment that declares a custom serializer
在這里org.jbpm.impl.YourCustomSerializer必須實(shí)現org.jbpm.delegation.serializer,然后,jbpm就知道如何識別你新定義的類(lèi)型變量,并把它轉換成文本域(DB中)
為了避免jbpm只能自動(dòng)識別serializer來(lái)使用,可以像下面這樣指定變量:
...
<type java-type="org.jbpm.impl.YourCustomJavaType">
<delegation class="org.jbpm.impl.YourCustomSerializer" />
<variable name="your-custom-var-name">
<variable name="your-second-custom-var-name">
</type>
...
jpdl-fragment that declares a custom serializer
最后是聲明變遷變量,變遷變量能被actionhandler訪(fǎng)問(wèn),但是,他們將被存儲到數據庫中,下面是個(gè)例子:
...
<type>
<transient />
<variable name="your-transient-var-name">
<variable name="your-second-transient-var-name">
</type>
...
jpdl-fragment that declares transient variables
8、 以客戶(hù)端訪(fǎng)問(wèn)變量
9、 以一個(gè)action訪(fǎng)問(wèn)變量
10、 安排任務(wù)
聯(lián)系客服