jbpm中的excutionservice詳解

2021-06-02 11:31:20 字數 3225 閱讀 1463

最新的流程例項 -- 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...