Events 事件
1, 事件用於對發生在流程生命周期的事情進行建模。事件總是被形象成一個圓圈。在BPMN 2.0 中,存在兩種主要的事件類型:捕獲事件和拋出事件。
捕獲:流程執行到該事件時,會等待事件觸發。事件觸發類型由內部圖標或XML中的類型聲明來定義。捕獲事件視覺上可以通過里面沒有填充的內部圖標與拋出事件進行區分(也就是說,圖標是白色的)。
拋出:流程執行到該事件時,事件就會被觸發。該事件觸發的類型由內部圖標或XML中的類型聲明來定義。拋出事件視覺上可以通過內部圖標與拋出的事件進行區分,拋出事件的圖標使用黑色填充。
Timer Event Definitions 定時器事件
定時器事件是被定義的定時器觸發的事件。可以作為啟動事件、中間事件或邊界事件來使用。
定時器的定義只能有以下的一個元素:
timeData:該格式以ISO 8601格式指定了觸發事件的確定時間(譯注,即,在確定時刻觸發定時器事件)。示例:
<timerEventDefinition> <timeDate>2011-03-11T12:13:14</timeDate> </timerEventDefinition>
timeDuration:指定定時器事件在觸發前運行多長時間,timeDuration可以作為timerEventDuration的子元素來指定。使用的格式是ISO 8601格式(這是BPMN 2.0規范所要求的)。示例(間隔10天 ):
<timerEventDefinition> <timeDuration>P10D</tim </timerEventDefinition>
timeCycle:指定循環的時間間隔(譯注,即,每隔多長時間執行一次循環),這對於周期性的啟動流程或者給過期的用戶任務發送提示是很有幫助的。時間循環元素可以使用兩種格式來指定。首先是循環次數的持續的格式,這是ISO 8601所規定的。示例(循環3次,每次循環持續10小時)
<timerEventDefinition> <timeCycle>R3/PT10H</timeCycle> </timerEventDefinition>
此外,你也可以使用cron表達式來指定循環次數,下面的示例展示了每5分鍾觸發一次
0 0/5 * * * ?
循環持續的次數更適合處理那些在時間上相對於某個特定的時間點(如,用戶任務開始時)來計算的相對定時器,
然而cron表達式可以處理絕對定時器,這對於timer start events是特別有用的。
你可以在定義定時器事件時使用表達式,這樣你就可以基於流程變量來影響定時器的定義。流程變量必須包含恰當定時
器類型的ISO 8601 字符串(或循環類型cron)。
<boundaryEvent id="escalationTimer" cancelActivity="true" attachedToRef="firstLineSupport"> <timerEventDefinition> <timeDuration>${duration}</timeDuration> </timerEventDefinition> </boundaryEvent>
注意:只有在開啟作業執行器時,定時器事件才能被觸發(即,需要在activiti.cfg.xml中將jobExecutorActivat 設置為true),
因為默認job executor 是被禁用的。
Start Events 啟動事件
啟動事件表示流程的開始。定義了流程如何被啟動的啟動事件類型(當收到消息、特定的時間間隔、等等,啟動流程)是以一個小圖標來形象表示事件的。在XML表示中,類型是由子元素的聲明給出的。啟動事件總是捕獲型的:從概念上講,該事件(任何時候)會一直等待直到觸發發生。
啟動事件中,可以指定以下Activiti 所特有的屬性:
formKey:指向一個用戶必須在啟動新流程實例時填寫的表單模板。更多信息見表單一節。示例:
<startEvent id="request"activiti:formKey="org/activiti/examples/taskforms/request.form"/>
initiator:指明在流程啟動時存儲被認證的用戶id 的變量名。示例:
<startEvent id="request"activiti:initiator="initiator"/>
被認證的用戶必須必須在tye-finally塊中使用方法IdentityService.setAuthenticatedUserId(String)來設置,如下
try{
identityService.setAuthenticatedUserId("bono");
runtimeService.startProcessInstanceByKey("someProcessKey");
}finally{
identityService.setAuthenticatedUserId(null);
}
None Start Event 空啟動事件
從技術上講,‘空’啟動事件意味着不給啟動流程實例指定觸發器。空啟動事件使用在通過調用startProcessInstanceByXXX方法啟動流程實例的時候。
ProcessInstance processInstance= runtimeService.startProcessInstanceByXXX();
注意:子流程總是有一個空啟動事件。
空啟動事件被形象化成不帶內圖標的圓(即,沒有觸發器類型)。
空啟動事件的XML表示是不帶子元素的普通啟動事件聲明(其它啟動事件類型都有聲明類型的子元素)。
<startEventid="start"name="my start event"/>
Timer Start Event 定時器啟動事件
定時器啟動事件用於在給定的時間點創建流程實例。它可以用在只啟動一次的流程中,也可以用在特定時間間隔下啟動的流程。
定時器啟動事件被形象化成帶有時鍾內圖標的圓。
從2011年3月11日12:13開始,流程將啟動4次,每次間隔5分鍾。
<startEvent id="theStart">
<timerEventDefinition>
<timeCycle>R4/2011-03-11T12:13/PT5M</timeCycle>
</timerEventDefinition>
</startEvent>
流程將在選定的時間上啟動一次
<startEventid="theStart">
<timerEventDefinition>
<timeDate>2011-03-11T12:13:14</timeDate>
</timerEventDefinition>
</startEvent>
End Events
終止事件表明流程或子流程(的執行路徑)的結束。終止事件總是拋出型的。這意味着當流程執行到終止事件時,有一個結果會被拋出。結果的類型是以事件的內部黑色圖標來表示的。XML表示中,類型是由子元素的聲明給出的。
空終止事件
‘空’終止事件意味着不指定當達到該事件時拋出的結果。這樣,流程引擎除了結束當前的執行路徑不會再執行任何其它操
作。

空終止事件的XML表示為沒有子元素的普通的終止事件的聲明(其它終止事件類型都有聲明類型的子元素)。
<endEventid="end"name="my end event"/>
Error End Event
當流程執行到異常終止事件時,會結束當前的執行路徑,並拋出一個異常。異常可以被與之匹配的中間邊界異常事件捕獲。如果沒有匹配的邊界異常事件,默認會采用空終止事件對待。
要點:BPMN異常與Java異常是不一樣的。事實上,兩者沒有任何共同點。BPMN異常事件是對業務異常建模的一種方式。Java異常則是以它所特有的方式來進行處理。
<endEvent id="myErrorEndEvent"> <errorEventDefinition errorRef="myError" /> </endEvent>
errorRef 屬性可以引用流程之外定義的error元素。
<error id="myError" errorCode="123" /> ... <process id="myProcess"> ...
error元素的errorCode屬性將用來查找與之匹配的捕獲邊界異常事件。如果errorRef與任何定義的異常都不匹配,那么errorRef會被當作errorCode的簡寫來使用。這是Activiti特有的簡寫。更具體地,在功能上下面的片段
<error id="myError" errorCode="error123" /> ... <process id="myProcess"> ... <endEvent id="myErrorEndEvent"> <errorEventDefinition errorRef="myError" /> </endEvent>
等價於
<endEvent id="myErrorEndEvent"> <errorEventDefinition errorRef="error123" /> </endEvent>
順序流
順序流是兩個流程元素的連接者。一個元素在流程執行期間被訪問后,流程會沿着該元素所有輸出順序流繼續執行。這意味着BPMN 2.0默認行為是並行的:兩個輸出順序流會創建兩條獨立、並行的執行路徑。
順序流要有流程唯一的id,以及指向現有起始元素和目標元素的引用。
<sequenceFlowid="flow1"sourceRef="theStart"targetRef="theTask"/>
條件順序流
可以在順序流上定義條件。當順序流程左側是BPMN 2.0的活動時,默認會計算其輸出順序流上的條件。選取條件成立的輸出順序流來執行。如果選取了多個順序流,就會創建多個執行路徑,並且流程會以並行的方式來執行。
注意:以上適用於BPMN 2.0的活動(以及事件),但是不適用於分支。根據分支的類型,其會以其特有的方式來處理帶有條件的順序流。
條件順序流被形象化成始點為一個小菱形的普通順序流。條件表達式緊挨着順序流。
<sequenceFlow id="flow"sourceRef="theStart"targetRef="theTask"> <conditionExpressionxsi:type="tFormalExpression"> <![CDATA[${order.price > 100 && order.price < 250}]]> </conditionExpression> </sequenceFlow>
目前,conditionExpression只能使用UEL,關於此的詳細信息見表達式一節。使用的表達式必須解析為布爾類型的值,否則在計算條件時會拋出異常。
下面的示例以典型的JavaBean風格通過getters來引用流程變量的數據。
<conditionExpressionxsi:type="tFormalExpression"> <![CDATA[${order.price > 100 && order.price < 250}]]> </conditionExpression>
該示例調用了一個返回布爾類型值的方法
<conditionExpression xsi:type="tFormalExpression"> <![CDATA[${order.isStandardOrder()}]]> </conditionExpression>
默認順序流
所有BPMN 2.0任務以及分支都可以有一個默認順序流。當且僅當沒有其它順序流被選擇時,才會選擇該順序流作為活動的輸出順序流。默認順序流上的條件總是被忽略掉。
默認順序流被形象化成起點帶‘斜線’的普通順序流。
某個活動的默認順序流是由那個活動上的default屬性定義的。下面的XML片段展示了包含一個默認順序流flow2的排他分支。只有當conditionA和conditionB都為false時,才會選取它作為分支的輸出順序流。
<exclusiveGatewayid="exclusiveGw"name="Exclusive Gateway"default="flow2"/> <sequenceFlowid="flow1"sourceRef="exclusiveGw"targetRef="task1"> <conditionExpressionxsi:type="tFormalExpression">${conditionA}</conditionExpression> </sequenceFlow> <sequenceFlowid="flow2"sourceRef="exclusiveGw"targetRef="task2"/> <sequenceFlowid="flow3"sourceRef="exclusiveGw"targetRef="task3"> <conditionExpressionxsi:type="tFormalExpression">${conditionB}</conditionExpression>
</sequenceFlow>
Gateways 分支
gateway用來控制執行流(或如BPMN 2.0描述的,執行令牌)。gateway可以回收或創建令牌。 gateway被形象化為里面有圖標的菱形。圖標說明了gateway的類型。
Exclusive Gateway 排它分支