本章內(nèi)容根據(jù)BPMN2.0規(guī)范的分類劃分為以下部分:
1.啟動與結(jié)束事件(event)
2.順序流(Sequence Flow)
3.任務(wù)(Task)
4.網(wǎng)關(guān)(Gateway)
5.子流程(Subprocess)
6.邊界事件(Boundary Event)
7.中間事件(Intermediate Event)
8.監(jiān)聽器(Listener)
一 啟動事件與結(jié)束事件
啟動事件與結(jié)束事件是很重要的一部分攀细,分別負(fù)責(zé)流程的開始與結(jié)束
圖例:
1.1 啟動事件
啟動事件又分為:
空啟動事件
定時啟動事件
異常啟動事件
1画侣、空啟動事件
<startEvent id="startevent" name="開始"></startEvent>
以上XML表示一個空啟動事件接谨,由于startEvent標(biāo)簽內(nèi)沒有任何元素定義剂癌,因此表示一個空啟動事件
屬性名稱 | 屬性說明 |
---|---|
avtiviti:formKey | Activiti擴展的formKey屬性哪自,可以用來指定啟動事件關(guān)聯(lián)的表單文件 |
activiti:initiator | activiti擴展的initiator事件线得,可以用來記錄啟動流程人的ID顶霞,啟動流程之后此屬性指定的變量就會自動設(shè)置當(dāng)前人的名稱 |
2.定時啟動事件
定時啟動事件可以用于一次性定時啟動尿褪,也可以用于特定時間定時啟動
<startEvent id="timerstartevent1" name="Timer start">
<timerEventDefinition></timerEventDefinition>
</startEvent>
以上XML就表示一個空定時啟動事件
屬性名稱 | 屬性說明 |
---|---|
timeDate | 一次性定時啟動睦擂,具體到一個日期 |
timeDuration | 設(shè)置多長時間之后啟動流程 |
timeCycle | 周期性啟動任務(wù),用來設(shè)定循環(huán)的時間間隔杖玲,表示多長時間執(zhí)行一次循環(huán) |
3.異常啟動事件
異常啟動事件可以出發(fā)一個異常子流程顿仇,但不能通過API方式啟動,總是在另外一個子流程拋出異常結(jié)束事件的時候被觸發(fā)
異常啟動事件"捕獲型"摆马,而異常結(jié)束事件是拋出型的
<endEvent id="errorendevent1" name="ErrorEnd">
<errorEventDefinition></errorEventDefinition>
</endEvent>
以上XML就表示一個空定時啟動事件
4.消息啟動事件
消息啟動事件可以通過一個消息名稱觸發(fā)臼闻,從而啟動一個流程實例,還可以結(jié)合消息拋出事件一起使用
1.2 結(jié)束事件
結(jié)束事件又分為:
空結(jié)束事件
異常結(jié)束事件
取消結(jié)束事件
1.空結(jié)束事件
結(jié)束事件是拋出型的囤采∈瞿牛空結(jié)束事件不處理拋出結(jié)果,空結(jié)束事件一般用于正常結(jié)束流程
2.異常結(jié)束事件
異常結(jié)束事件時有拋出結(jié)果的蕉毯,它定義了需要拋出的錯誤代碼乓搬,如果找到了異常開始事件定義的異常代碼思犁,則會觸發(fā)異常開始事件,否則按照空結(jié)束事件處理
3.終止結(jié)束事件
他可以終止一個流程實例的執(zhí)行
4.取消結(jié)束事件
取消結(jié)束事件可以取消一個事務(wù)子流程的執(zhí)行缤谎,同時也能在子流程中使用抒倚,
當(dāng)子流程在執(zhí)行過程中出現(xiàn)異常時,可以設(shè)置一個取消結(jié)束事件
二 任務(wù)
任務(wù)時流程中重要的組成部分,可分為:
用戶任務(wù)
腳本任務(wù)
WebServices任務(wù)
業(yè)務(wù)規(guī)則任務(wù)
郵件任務(wù)
Mule任務(wù)
Camle任務(wù)
手動任務(wù)
JavaService任務(wù)
Shell任務(wù)
2.1 用戶任務(wù)
<process id="myProcess" name="My process" isExecutable="true">
<userTask id="usertask1" name="User Task"></userTask>
</process>
以上XML定義了一個用戶任務(wù)
屬性名稱 | 屬性說明 |
---|---|
activiti:assignee | 用來指定用戶任務(wù)的處理人 |
activiti:cadidateUsers | 用來指定用戶任務(wù)的候選人坷澡,多個用逗號隔開 |
activiti:cadidateGroups | 用來指定多個候選組托呕,多個用逗號隔開 |
activiti:dueDate | 設(shè)置任務(wù)的到期日,通常用變量代替而不是設(shè)定一個具體的日期 |
activiti:priority | 設(shè)定任務(wù)的優(yōu)先級频敛,取值區(qū)間[0,100] |
2.2 腳本任務(wù)
腳本任務(wù)可以運行引擎依賴的語言之外的腳本語言
屬性名稱 | 屬性說明 |
---|---|
scriptFormat | 用來指定符合規(guī)范的腳本類型 |
activiti:resultvariable | 把腳本處理的結(jié)果保存到一個變量中 |
activiti:priority | 設(shè)定任務(wù)的優(yōu)先級项郊,取值區(qū)間[0,100] |
2.3 Java Service 任務(wù)
JavaService 任務(wù)允許指定一個實現(xiàn)了指定接口的java類,或者執(zhí)行一個表達(dá)式斟赚,可以把一個結(jié)果保存到一個變量中
屬性名稱 | 屬性說明 |
---|---|
activiti:class | 實現(xiàn)了接口JavaDelegate的Java類 |
activit:expression | 一個表達(dá)式 |
activiti:delegateExpression | 實現(xiàn)了指定接口的表達(dá)式 |
activiti:resultvariable | 把腳本處理的結(jié)果保存到一個變量中 |
2.4 WebServices 任務(wù)
通過WebServices任務(wù)可以調(diào)用外部的WebServices資源着降,完成調(diào)用只需要一些必須的配置就行
2.5 業(yè)務(wù)規(guī)則任務(wù)
業(yè)務(wù)規(guī)則任務(wù)可以根據(jù)流程變量的值預(yù)設(shè)的業(yè)務(wù)規(guī)則,就是把業(yè)務(wù)數(shù)據(jù)交由規(guī)則引擎處理拗军,規(guī)則引擎根據(jù)不同的業(yè)務(wù)規(guī)則得到最終的結(jié)果在返回給調(diào)用者
屬性名稱 | 屬性說明 |
---|---|
activiti:relues | 定義規(guī)則的名稱任洞,多個用逗號隔開 |
activit:ruleVariablesInput | 業(yè)務(wù)規(guī)則需要的 數(shù)據(jù)源使用${fooVar方式定義,多個用逗號隔開} |
activit:ruleVariablesName | 規(guī)則執(zhí)行結(jié)果變量发侵,變量的值為ruleVariablesInput定義的變量集合 |
activiti:execlude | 用來設(shè)置是否排除某些規(guī)則 |
2.6 郵件任務(wù)
郵件任務(wù)可以通過Activiti發(fā)送郵件交掏,其中郵件的信息通過變量的方式傳遞
屬性名稱 | 是否必須 | 描述 |
---|---|---|
mailServerHost | 否 | 郵件任務(wù)的主機名,默認(rèn)為host |
mailServerPost | 是刃鳄,如果不是默認(rèn)的端口 | 默認(rèn)為25盅弛,如果是使用SSL則為465 |
mailServerDefaultFrom | 否 | 發(fā)件人email,如果不設(shè)置默認(rèn)為:activiti@activiti.org |
mailServerUsername | 否,是否需要認(rèn)證設(shè)置 | 郵件服務(wù)認(rèn)證賬號 |
mailServerPassword | 否叔锐,是否需要認(rèn)證設(shè)置 | 郵件服務(wù)認(rèn)證密碼 |
屬性名稱 | 屬性說明 |
---|---|
to | 必填挪鹏,收件人,多個收件人用逗號隔開 |
from | 郵件發(fā)送人地址愉烙,如果不設(shè)置則使用mailServerDefaultFrom屬性指定的發(fā)件人 |
subject | 發(fā)件人email如果不設(shè)置讨盒,默認(rèn)為activiti@activiti.org |
cc | 抄送人列表 |
bcc | 密送人列表 |
charset | 郵件內(nèi)容字符集,建議使用UTF-8 |
text | 純文本內(nèi)容的郵件內(nèi)容 |
html | html格式的郵件內(nèi)容 |
三 網(wǎng)關(guān)
網(wǎng)關(guān)用于控制流程的走向步责,可分為:
排他網(wǎng)關(guān)
并行網(wǎng)關(guān)
包容網(wǎng)關(guān)
事件網(wǎng)關(guān)
3.1 排他網(wǎng)關(guān)
排他網(wǎng)關(guān)用來對流程中的決定進行建模返顺,流程執(zhí)行到該網(wǎng)關(guān)時,按照輸出流的順序逐個計算勺择,當(dāng)條件計算結(jié)果為true時,繼續(xù)執(zhí)行伦忠,如果多個線路的計算結(jié)果都為true時省核,那么只會執(zhí)行第一個值為true的網(wǎng)關(guān)
3.2 并行網(wǎng)關(guān)
并行網(wǎng)關(guān)用來對并發(fā)的任務(wù)進行流程建模,并行網(wǎng)關(guān)的任務(wù)取決于輸入昆码,輸出順序流
拆分:并行執(zhí)行所有的輸出輸入順序流气忠,并且為每一條順序流創(chuàng)建一個并行執(zhí)行線路
合并:所有從并行網(wǎng)關(guān)拆分并執(zhí)行完成的線路均在此等候邻储,直到所有的線路都執(zhí)行完成才繼續(xù)向下執(zhí)行
3.3包容網(wǎng)關(guān)
包容網(wǎng)關(guān)融合了排他網(wǎng)關(guān)和并行網(wǎng)關(guān)的特性,包容網(wǎng)關(guān)既可以同事執(zhí)行多條線路旧噪。有允許在網(wǎng)關(guān)上設(shè)置條件吨娜,也分為拆分與合并
3.4 事件網(wǎng)關(guān)
事件網(wǎng)關(guān)是專門為中間捕獲事件設(shè)置的,它允許多個輸出流指向多個不同的中間捕獲事件淘钟。當(dāng)流程執(zhí)行到事件網(wǎng)關(guān)后流程處于等待的狀態(tài)宦赠,因為中間等待事件需要依賴中間拋出事件觸發(fā)
四 子流程
把一切需要處理的任務(wù)歸結(jié)到一起作為作為一個大流程的一部分,因為子流程嵌入在主流程中米母,所有也叫"嵌入式子流程"
子流程限制:
只能包含一個空啟動事件
至少有一個結(jié)束事件
在子流程中不能把輸出流設(shè)置到子流程之外的活動上
4.1 調(diào)用活動
調(diào)用活動解決的問題是流程的通用性勾扭,和子流程一樣只不過表現(xiàn)的方式不同而已
屬性名稱 | 屬性說明 |
---|---|
calledElement | 流程的ID對應(yīng)的流程應(yīng)該獨立存在 |
activiti:in | 調(diào)用外部流程時傳入的變量,被調(diào)用活動需要獲取主流的信息 |
activiti:out | 調(diào)用活動完成后的結(jié)果 |
五 監(jiān)聽器
在Activiti 中開發(fā)人員可以通過配置監(jiān)聽器的方式監(jiān)聽各種動作铁瞒,例如流程 的啟動妙色,結(jié)束,創(chuàng)建慧耍,任務(wù)的完成
監(jiān)聽器分為兩類:執(zhí)行監(jiān)聽器和任務(wù)監(jiān)聽器
執(zhí)行監(jiān)聽器可以捕獲的事件如下:
流程實例的啟動身辨,結(jié)束
輸出流的捕獲
活動的啟動,結(jié)束
路由開始芍碧,結(jié)束
中間事件開始煌珊,結(jié)束
觸發(fā)開始事件,觸發(fā)結(jié)束事件
import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.ExecutionListener;
public class ExecutionListenerForFlow implements ExecutionListener{
@Override
public void notify(DelegateExecution delegate) throws Exception {
}
}
任務(wù)監(jiān)聽器相對于執(zhí)行監(jiān)聽器的使用范圍要小的多师枣,因為它只適用于用戶任務(wù)怪瓶,用來監(jiān)聽3鐘事件
create:在任務(wù)被創(chuàng)建且所有的任務(wù)屬性設(shè)置完成后才觸發(fā)
assignment:在任務(wù)被分配給某個辦理人之后觸發(fā)
complete:在配置了監(jiān)聽器的上一個任務(wù)完成時觸發(fā)
import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.delegate.TaskListener;
public class ExecutionListenerForFlow implements TaskListener{
@Override
public void notify(DelegateTask arg0) {
// TODO Auto-generated method stub
}
}