最新的流程例項 -- bykey
下面是為流程定義啟動乙個新的流程例項的最簡單也是 最常用的方法:
processinstance processinstance = executionservice.startprocessinstancebykey("icl");
上面service的方法會去查詢 key為icl的最新版本的流程定義, 然後在最新的流程定義裡啟動流程例項。
當key為icl的流程部署了乙個新版本, startprocessinstancebykey方法會自動切換到最新部署的版本。
原來已經啟動的流程,還是按照啟動時刻的版本執行。
指定流程版本 -- byid
換句話說,你如果想根據特定的版本啟動流程例項, 便可以使用流程定義的id啟動流程例項。如下所示:
processinstance processinstance = executionservice.startprocessinstancebyid("icl-1");
使用key
我們可以為新啟動的流程例項分配乙個key(注意: 這個key不是process的key,而是啟動的instance的key ),這個key是使用者執行的時候定義的,有時它會作為「業務key」引用。乙個業務key必須在流程定義的所有版本範圍內是唯一的。通常很容易在業務流程領域找到這種key。比如,乙個訂單id或者乙個保險單號。
processinstance processinstance = executionservice.startprocessinstancebykey("icl", "cl92837");
// 2個引數:
// 第乙個引數processkey,通過這個key啟動process的乙個例項
// 第二個引數為這裡所說的例項key(instance key)
key可以用來建立流程例項的id,格式為.。所以上面的**會建立乙個id為 icl.cl92837的流向(execution)。
如果沒有提供使用者定義的key,資料庫就會把主鍵作為key。 這樣可以使用如下方式獲得id:
processinstance processinstance = executionservice.startprocessinstancebykey("icl");
string pid = processinstance.getid();
最好使用乙個使用者定義的key。特別在你的應用**中,找到這樣的key並不困難。提供給乙個使用者定義的key,你可以組合流向的id,而不是執行乙個基於流程變數的搜尋 - 那種方式太消耗資源了。
使用變數
當乙個新的流程例項啟動時就會提供一組物件引數。 將這些引數放在variables變數裡, 然後可以在流程例項建立和啟動時使用。
mapvariables = new hashmap();
variables.put("customer", "john doe");
variables.put("type", "accident");
variables.put("amount", new float(763.74));
processinstance processinstance = executionservice.startprocessinstancebykey("icl", variables);
啟動instance
啟動instance,必須要知道processdefinition的資訊:processdefinition可以通過2種方式獲取:
bykey:通過processkey,啟動該process的最新版本
byid: 通過process的id,啟動該process的特定的版本
其他的引數,其餘還可以在啟動instance的時候,給流程2個引數:
instancekey:這個instancekey必須在整個流程定義的所有範圍版本中唯一,如果使用者不給於提供,系統也會自己生成;
乙個map表:啟動流程時候給予的變數資訊
執行等待的流向
當使用乙個state 活動時,執行(或流程例項)會在到達state的時候進行等待,直到乙個signal (也叫外部觸發器)出現。 signalexecution方法可以被用作這種情況。執行通過乙個執行id (字串)來引用。
在一些情況下,到達state的執行會是流程例項本身。但是這不是一直會出現的情況。在定時器和同步的情況,流程是執行樹形的根節點。所以我們必須確認你的signal作用在正確的流程路徑上。
獲得正確的執行的比較好的方法是給state活動分配乙個事件***,像這樣:
...
在事件***startexternalwork 中,你可以執行那些需要額外完成的部分。在這個事件***裡,你也可以通過execution.getid() 獲得確切的流程id。那個流程id,在額外的工作完成後,你會需要它來提供給signal操作的:
executionservice.signalexecutionbyid(executionid);
這裡有乙個可選的(不是太推薦的)方式,來獲得流程id,當流程到達state 活動的時候。只可能通過這種方式獲得執行id,如果你知道哪個jbpm api呼叫了之後,流程會進入state 活動:
// assume that we know that after the next call
// the process instance will arrive in state external work
processinstance processinstance = executionservice.startprocessinstancebyid(processdefinitionid);
// or processinstance processinstance =
// executionservice.signalprocessinstancebyid(executionid);
execution execution = processinstance.findactiveexecutionin("external work");
string executionid = execution.getid();
jbpm中Decision的使用
decision是jbpm中非常重要的一種node,在我們的一般的工作流系統中使用的也很頻繁,本文談談它的使用.1 如果客戶端能夠比較容易的判斷decision後應該到哪個transition,我們只需要把 transition的名稱作為signal發給token就可以了,此時,引擎將驅動流程轉向該...
JBPM中的起始任務
jbpm 中的起始任務 什麼是起始任務 所謂起始任務就是在開始狀態 start state 中定義的任務 task 如下定義 注意 開始狀態只能有乙個任務 起始任務的建立執行 如果定義了起始任務,就可以通過建立起始任務來啟動流程的執行,而不是通過向根令牌發訊號的方式。如下 建立起始任務 taskin...
關於jbpm中的問題
看見很多人。在使用jbpm,讀取手寫的xml檔案時,出現的 16 30 03,125 main error jpdlxmlreader couldn t parse process definition org.dom4j.documentexception null nested exceptio...