當需要使業(yè)務流程受到某些特定的外部干預處理后再繼續(xù)進行,而在外部干預之前邀泉,流程會處于一個中斷等待的狀態(tài)嬉挡,這時就使用到 state 活動。當流程運行到 state 活動時汇恤,就會自動陷入等待狀態(tài)(waitting state)庞钢,也就是說流程引擎在收到外部觸發(fā)信號之前,會讓流程實例在這個 state 活動持續(xù)等待因谎。
state 活動除了最基本的 name 屬性和 transition 等元素之外基括,沒有其他的屬性或元素。
我們設計一個 state 串行序列的流程:
state 串行序列
<?xml version="1.0" encoding="UTF-8"?>
<process key="StateSequence" name="StateSequence" xmlns="http://jbpm.org/4.4/jpdl">
<start g="297,123,48,48" name="start1">
<transition g="-29,-9" name="to a" to="a"/>
</start>
<state g="271,205,92,52" name="a">
<transition g="-28,-11" name="to b" to="b"/>
</state>
<state g="269,290,92,52" name="b">
<transition g="-32,-11" name="to c" to="c"/>
</state>
<state g="267,361,92,52" name="c"/>
</process>
然后編寫代碼讓這個流程實例運行流轉起來:
//發(fā)起實例
ProcessInstance processInstance = executionService.startProcessInstanceByKey
("StateSequence");
//觸發(fā)流程走到下一步
Execution executionInA = processInstance.findActiveExecutionIn("a");
assertNotNull(executionInA);//在 a 節(jié)點
//發(fā)出執(zhí)行信號
processInstance=executionService.signalExecutionById(executionInA.getId());
Execution executionInB=processInstance.findActiveExecutionIn("b");
assertNotNull(executionInB);//在 b 節(jié)點
//發(fā)出執(zhí)行信號
processInstance=executionService.signalExecutionById(executionInB.getId());
Execution executionInC=processInstance.findActiveExecutionIn("c");
assertNotNull(executionInC);//在 c 節(jié)點
在 state 活動中可以定義多個 transition 元素财岔,我們可以通過信號來傳輸指定轉移路徑的名稱风皿,這樣就可以選擇其中的一條 transition 來流轉咯。
選擇 state 轉移
對應的 XML:
<?xml version="1.0" encoding="UTF-8"?>
<process key="StateChoice" name="StateChoice" xmlns="http://jbpm.org/4.4/jpdl">
<start g="349,74,48,48" name="start1">
<transition to="等待響應"/>
</start>
<state g="283,151,174,52" name="等待響應">
<transition g="262,176:-47,-18" name="同意" to="提交文檔"/>
<transition g="476,176:25,-15" name="拒絕" to="再試一次吧"/>
</state>
<state g="190,247,147,52" name="提交文檔"/>
<state g="432,252,92,52" name="再試一次吧"/>
</process>
測試代碼:
//發(fā)起實例
ProcessInstance processInstance = executionService.startProcessInstanceByKey
("StateChoice");
Set<String> activities=processInstance.findActiveActivityNames();
//獲取流程實例的 ID
String executionId = processInstance.findActiveExecutionIn("等待響應").getId();
//觸發(fā) accept 信號
processInstance = executionService.signalExecutionById(executionId, "同意");
assertTrue(processInstance.isActive("提交文檔"));
如果使用 "拒絕" 作為信號傳入 signalExecutionById()匠璧,那么流程將會流向 “再試一次吧” 的活動桐款。