使用Camunda前,首先介紹幾個(gè)概念:
1.什么是流程定義-ProcessDefinition:
ProcessDefinition(流程定義)就是一個(gè)流程的步驟說明,比如一個(gè)審批流程钞楼,申請(qǐng)人王三發(fā)起提交申請(qǐng),李四作為部門經(jīng)理進(jìn)行審批振湾,審批完成后暇务,此申請(qǐng)到達(dá)下一級(jí)總經(jīng)理王五,進(jìn)行審批拿撩。就這么整個(gè)流程說明其實(shí)就是流程定義衣厘,不過在Camunda中整個(gè)流程定義是以helloworld.bpmn與helloworld.png格式存在的。
2.什么是流程部署:
流程被設(shè)計(jì)好之后,得到.bpmn或者pngde 文件影暴,那他如何被劉程引擎解析的错邦,這時(shí)候就需要將流程定義部署到流程引擎上。流程每部署一次就會(huì)得到一個(gè)deploymentId
3.什么是流程實(shí)例-ProcessInstance:
每開啟流程一次就會(huì)生成一條相應(yīng)的流程實(shí)例型宙,開啟流程其實(shí)就是將流程運(yùn)轉(zhuǎn)起來撬呢,就像請(qǐng)假流程,只有當(dāng)用戶發(fā)出請(qǐng)假申請(qǐng)(開啟請(qǐng)假流程)妆兑,就會(huì)生成一條請(qǐng)假實(shí)例魂拦。
一個(gè)流程實(shí)例就表示流程從開始到結(jié)束最大的流程分支。開啟一個(gè)流程就只能有一個(gè)流程實(shí)例
4.什么是執(zhí)行實(shí)例-executeInstance:
啟動(dòng)流程搁嗓,首先會(huì)創(chuàng)建流程實(shí)例芯勘,如果存在子流程、多實(shí)例腺逛、并行網(wǎng)關(guān)荷愕,會(huì)再次創(chuàng)建執(zhí)行實(shí)例,當(dāng)所有的執(zhí)行實(shí)例按照一定規(guī)則結(jié)束執(zhí)行后棍矛,流程實(shí)例也就隨之結(jié)束路翻。
執(zhí)行實(shí)例的父級(jí)或者父級(jí)的父級(jí)就是流程實(shí)例。
下面是以并行網(wǎng)關(guān)為例介紹茄靠,流程實(shí)例和執(zhí)行實(shí)例之間的關(guān)系茂契;
下面是以多實(shí)例為例介紹,流程實(shí)例和執(zhí)行實(shí)例之間的關(guān)系:
執(zhí)行樹的壓縮和優(yōu)化
引入活動(dòng)實(shí)例樹的第二個(gè)原因是慨绳,流程引擎運(yùn)行時(shí)壓縮和優(yōu)化執(zhí)行樹掉冶。考慮一個(gè)并行網(wǎng)關(guān)有兩個(gè)usertasks的例子脐雪。最初T1和T2都是活動(dòng)的厌小。在執(zhí)行樹中,我們將看到無效的并發(fā)根執(zhí)行等待在并行網(wǎng)關(guān)战秋,為每個(gè)任務(wù)之一璧亚。活動(dòng)實(shí)例樹具有相同的結(jié)構(gòu)脂信,但根節(jié)點(diǎn)對(duì)應(yīng)的流程實(shí)例本身癣蟋,并且它并不等待在并行網(wǎng)關(guān). 當(dāng)T2完成任務(wù)后,將壓縮流程引擎執(zhí)行樹狰闪,去除T1的執(zhí)行疯搅,并用根執(zhí)行取代它。如果執(zhí)行T1引用了變量或任務(wù)埋泵,那么它們將被移動(dòng)到根執(zhí)行中幔欧∽镏危活動(dòng)實(shí)例樹看起來不同的是:它仍然包含一個(gè)T1的活動(dòng)實(shí)例和流程定義本身。
這種行為(behavior)的衍生,在執(zhí)行樹種并不存在"節(jié)點(diǎn)實(shí)例標(biāo)識(shí)"(activity instance identity) 這種概念. 沒有唯一標(biāo)識(shí)來描述一個(gè)節(jié)點(diǎn)的實(shí)例礁蔗。在一般情況下觉义,是無法保證同一個(gè)進(jìn)入節(jié)點(diǎn)實(shí)例執(zhí)行將會(huì)完全一致的完成它。例如: 在上面的例子中T1 是以執(zhí)行ID=2開始 以執(zhí)行ID=1結(jié)束浴井。
注: 節(jié)點(diǎn)實(shí)例 即 活動(dòng)實(shí)例
4.Task
Task
任務(wù)晒骇,當(dāng)流程流轉(zhuǎn)到某個(gè)階段,需要用戶審核或者其他操作的時(shí)候滋饲,這個(gè)需要用戶來完成的操作就是一個(gè)任務(wù)厉碟,除了用戶任務(wù)之外,還有系統(tǒng)任務(wù)等其他任務(wù)
任務(wù)執(zhí)行人
如果需要讓某個(gè)用戶執(zhí)行某個(gè)任務(wù)屠缭,首先需要將任務(wù)分配給用戶箍鼓,一般有3種分配方式
直接指定,這里通過Assignee來直接指定某一個(gè)具體的用戶(一般是用戶ID或者唯一的用戶名)呵曹,支持表達(dá)式以支持動(dòng)態(tài)指定
指定候選人款咖,通過candidateUser來指定一系列候選人,如果是多個(gè)用戶奄喂,通過,號(hào)分隔
指定候選組铐殃,通過candidateGroup來指定某一個(gè)組里面的所有用戶(實(shí)際測(cè)試中,發(fā)現(xiàn)候選人和候選組是并集關(guān)系)
如果指定了候選人和候選組跨新,那么并不意味著所有的候選人都需要執(zhí)行任務(wù)富腊,這些人首先需要進(jìn)行一個(gè)認(rèn)領(lǐng)的操作,一個(gè)任務(wù)只能由一個(gè)人認(rèn)領(lǐng)域帐,認(rèn)領(lǐng)完成后才能執(zhí)行任務(wù)赘被,相對(duì)的,也可以取消認(rèn)領(lǐng)
5.RepositoryService
流程存儲(chǔ)服務(wù)RepositoryService主要的功能如下:
管理流程定義文件xml和靜態(tài)資源的服務(wù)
對(duì)特定流程的暫停和激活
流程定義啟動(dòng)權(quán)限管理
部署文件構(gòu)造器DeploymentBuilder
部署文件查詢器DeploymentQuery
流程定義查詢對(duì)象ProcessDefinition
流程定義的java格式BpmnModel
6.RuntimeService
該類就是啟動(dòng)實(shí)例肖揣,查詢與實(shí)例相關(guān)的一些信息