activiti入門(含代碼)

代碼地址:https://gitee.com/zhangxin123150/activiti-demo

BPM(business process management),業(yè)務(wù)流程管理

BPMN(business process model and notation),業(yè)務(wù)流程模型和符號

1.?使用步驟

l?部署activiti:activiti就是一堆jar包岁歉,因此需要和業(yè)務(wù)系統(tǒng)一起部署

l?定義流程:使用activiti的建模工具定義業(yè)務(wù)流程.bpmn文件

l?部署流程定義:使用activiti提供的api把流程定義內(nèi)容存儲起來氨鹏,再activiti執(zhí)行過程匯總可以查看定義的內(nèi)容针余。Activiti是通過數(shù)據(jù)庫來存儲業(yè)務(wù)流程的票唆。

l?啟動流程實例:流程實例也叫processInstance希太,啟動一個流程實例表示開始一次業(yè)務(wù)流程的運作。

l?用戶查詢待辦任務(wù)(task):因為現(xiàn)在系統(tǒng)的業(yè)務(wù)流程都交給了activiti管理,通過activiti就可以查詢當(dāng)前流程執(zhí)行到哪個步驟了。當(dāng)前用戶需要辦理哪些業(yè)務(wù)同樣由activiti管理盖矫,不需要編寫sql進行查詢了丽惭。

l?用戶辦理任務(wù):用戶查詢到自己的待辦任務(wù)后,就可以辦理某個業(yè)務(wù)辈双,如果這個業(yè)務(wù)辦理完成還需要其他用戶辦理责掏,就可以由activiti幫我們把工作流程往后的步驟推動。

l?流程結(jié)束:當(dāng)業(yè)務(wù)辦理完成沒有下一個任務(wù)節(jié)點后湃望,這個流程實例就執(zhí)行完成了拷橘。

2.?環(huán)境搭建

Idea中安裝流程定義插件actiBPM。

3.?創(chuàng)建流程定義

1)在resource目錄下創(chuàng)建***.bpmn文件


2)構(gòu)建流程圖:注意整個流程定義的id和name喜爷,以及每個節(jié)點對象的name和assignee



3)復(fù)制***.bpmn文件,加后綴.xml萄唇,用idea的Diagrams打開檩帐,可以導(dǎo)出流程定義的png文件


4)部署流程


4.?Test

5.?流程定義與流程實例

流程定義ProcessDefinition和流程實例ProcessInstance是activiti中非常重要的兩個概念。他們的關(guān)系類似于java中類和對象的概念另萤。

流程定義是以BPMN文件定義的一個工作流程湃密,是一組工作規(guī)范。例如之前請假流程

流程實例是指一個具體的業(yè)務(wù)流程四敞。例如某個員工發(fā)起一次請假泛源,就會實例化一個請假的流程實例,并且每個不同的流程實例之間互不影響忿危。

在后臺的表結(jié)構(gòu)中达箍,有很多表都包含了流程定義和流程實例的字段。

流程定義字段通常是PROC_DEF_ID铺厨,流程實例字段通常是PROC_INST_ID缎玫。

啟動流程實例,添加businessKey


當(dāng)我們?nèi)ゲ榭磗tartProcessInstanceByKey這個方法時解滓,有好多重載的實現(xiàn)方法赃磨,可以傳一些不同的參數(shù)。

l?String processDefinitionKey:流程定義的唯一鍵洼裤,不能為空

l?String businessKey:每個流程實例上下文中關(guān)聯(lián)的唯一鍵

這是activiti提供的一個非常重要的便利邻辉,用來將activiti的工作流程與實際業(yè)務(wù)進行關(guān)聯(lián)。

例如腮鞍,當(dāng)我們需要對一個業(yè)務(wù)訂單進行審批時值骇,訂單的詳細信息并不在activiti的數(shù)據(jù)當(dāng)中,但是在審批時確實需要查看這些信息移国。

l?Map<String,Object> variables:在流程實例中傳遞的流程變量

l?String tenantId:租戶id,支持多租戶設(shè)計

6.?流程掛起與激活

有時候我們要暫停一個流程雷客,過一段時間恢復(fù)。例如月底不接受報銷審批流程桥狡,年底不接受接待審批流程搅裙,非工作日不接收售后報銷流程等皱卓,這個時候,就可以將流程進行掛起操作部逮,掛起的流程不會再繼續(xù)執(zhí)行娜汁。

掛起時有兩種操作方式

l?將整個流程定義掛起,這樣這個流程定義下所有的流程實例都掛起兄朋,無法進行執(zhí)行

l?掛起當(dāng)前實例掐禁,該實例不允許操作

7.?流程變量

流程變量也是activiti中非常重要的角色。我們之前的請假流程并沒有利用到流程變量颅和,每個步驟都是非常固定的傅事,但是,當(dāng)我們需要實現(xiàn)一些負責(zé)的業(yè)務(wù)流程峡扩,比如請假3天以內(nèi)部門經(jīng)理審批蹭越,3天以上需要增加總經(jīng)理審批這樣的流程,就需要到流程變量了教届。

l?流程變量的作用域

1.?global變量

這個是流程變量默認的作用域响鹃,作用范圍是一個完整的流程實例。

變量名不可重復(fù)案训,重復(fù)會被覆蓋

2.?local變量

Local變量的作用域只針對一個任務(wù)或者一個執(zhí)行實例的范圍买置。

變量名可以重復(fù),互不影響

l?使用流程變量

定義好流程變量后强霎,就可以在整個流程定義中使用了忿项。例如可以在某些任務(wù)屬性assignee上使用${assignee},或者在某些連線上使用${evection.num<3}城舞。

Activiti中可以使用UEL表達式來使用這些流程變量倦卖。UEL表達式可以直接獲取一個變量的值,也可以計算一個boolean結(jié)果的表達式椿争,還可以直接使用某些對象的屬性怕膛。例如之前創(chuàng)建的請假流程,如果要實現(xiàn)3天以內(nèi)部門經(jīng)理審批秦踪,3天以上增加總經(jīng)理審核褐捻,可以做如下調(diào)整:


注意事項:

1)如果UEL表達式中流程變量名不存在則報錯

2)如果UEL表達式中流程變量值為null,流程不按UEL表達式執(zhí)行椅邓,而是結(jié)束

3)如果UEL表達式都不符合條件柠逞,流程結(jié)束

4)如果連線不設(shè)置條件,會走flow序號小的那條線

5)設(shè)置流程變量會在當(dāng)前執(zhí)行流程變量表act_ru_variable中插入記錄景馁,同時也會在歷史流程變量表act_hi_varinst中插入記錄

l?

8.?網(wǎng)關(guān)

1)?排他網(wǎng)關(guān)(ExclusiveGateway)

排他網(wǎng)關(guān)板壮,用來在流程中實現(xiàn)決策。當(dāng)流程執(zhí)行到這個網(wǎng)關(guān)合住,所有分支都會判斷條件是否為true绰精,如果為true則執(zhí)行該分支撒璧。

如果網(wǎng)關(guān)有兩個分支條件為true,排他網(wǎng)關(guān)會選擇id值較小的一條分支執(zhí)行笨使。

注意:線條上也可以根據(jù)條件來實現(xiàn)流程分支選擇卿樱,與網(wǎng)關(guān)不同的地方在于,線條上的條件不滿足的話硫椰,流程結(jié)束繁调;排它網(wǎng)關(guān)的話會拋出系統(tǒng)異常。

2)?并行網(wǎng)關(guān)(ParallelGateway)

并行網(wǎng)關(guān)允許將流程分成多條分支靶草,也可以把多條分支匯聚到一起蹄胰,并行網(wǎng)關(guān)的功能是基于進入和外出順序流的。

Fork分支:并行后的所有外出順序流奕翔,為每個順序流都創(chuàng)建一個并發(fā)分支

Join匯聚:所有到達并行網(wǎng)關(guān)裕寨,在此等待的進入分支,直到所有進入順序流的分支都到達以后糠悯,流程就會通過匯聚網(wǎng)關(guān)

與其他網(wǎng)關(guān)的主要區(qū)別,并行網(wǎng)關(guān)不會解析條件妻往,即使順序流中定義了條件互艾,也會忽略

3)?包含網(wǎng)關(guān)

包含網(wǎng)關(guān)可以看作是排他網(wǎng)關(guān)和并行網(wǎng)關(guān)的結(jié)合體

和排他網(wǎng)關(guān)一樣,你可以在外出順序流上定義條件讯泣,包含網(wǎng)關(guān)會解析他們纫普。但是主要的區(qū)別是包含網(wǎng)關(guān)可以選擇多于一條順序流,和并行網(wǎng)關(guān)一樣

包含網(wǎng)關(guān)的功能是基于進入和外出順序流的

Fork分支:所有外出順序流的條件都會被解析好渠,結(jié)果為true的順序流會以并行方式繼續(xù)執(zhí)行昨稼,為每個順序流創(chuàng)建一個分支

Join匯聚:所有并行分支到達包含網(wǎng)關(guān),會進入等待狀態(tài)拳锚,直到每個包含流程token的進入順序流的分支都到達假栓。這是與并行網(wǎng)關(guān)的最大不同。換句話說霍掺,包含網(wǎng)關(guān)只會等待被選中執(zhí)行了的進入順序流匾荆,匯聚之后繼續(xù)執(zhí)行

4)?事件網(wǎng)關(guān)

事件網(wǎng)關(guān)允許根據(jù)事件判斷流向。網(wǎng)關(guān)的每個外出順序流都要連接到一個中間捕獲事件杆烁。當(dāng)流程到達一個基于事件網(wǎng)關(guān)牙丽,網(wǎng)關(guān)會進入等待狀態(tài):會暫停執(zhí)行。與此同時兔魂,會為每個外出順序流創(chuàng)建相對的事件訂閱烤芦。

事件網(wǎng)關(guān)的外出順序流和普通順序流不同,這些順序流不會真的“執(zhí)行”析校,相反他們讓流程引擎去決定執(zhí)行到事件網(wǎng)關(guān)的流程需要訂閱哪些事件构罗。要考慮以下條件:

1)事件網(wǎng)關(guān)必須有兩條或以上外出順序流

2)事件網(wǎng)關(guān)后铜涉,只能使用intermediateCarchEvent類型(activiti不支持基于事件網(wǎng)關(guān)后連接ReceiveTask)

3)連接到事件網(wǎng)關(guān)的中間捕獲事件必須只有一個入口順序流


9.?組任務(wù)分配

設(shè)置多個候選人

之前我們通過設(shè)置assignee來靈活的設(shè)定負責(zé)人。但是日常工作中绰播,還有一類常見的需求無法支持骄噪,例如某個訂單合同,需要找部門經(jīng)理級別的負責(zé)人簽字蠢箩。而公司中有多個部門經(jīng)理链蕊,業(yè)務(wù)上只需要找其中任意一個人完成審批就可以了。這種場景下谬泌,我們就無法通過設(shè)置流程變量的方式來設(shè)置負責(zé)人滔韵。這時,就需要用到activiti提供的另一個利器-任務(wù)候選人(Candidate Users)掌实。

這時陪蜻,可以給任務(wù)設(shè)置多個候選人candidate-users,多個候選人之間用逗號隔開贱鼻。


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末宴卖,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子邻悬,更是在濱河造成了極大的恐慌陕赃,老刑警劉巖袜刷,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件社牲,死亡現(xiàn)場離奇詭異出牧,居然都是意外死亡,警方通過查閱死者的電腦和手機蛾扇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門攘烛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人镀首,你說我怎么就攤上這事坟漱。” “怎么了更哄?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵靖秩,是天一觀的道長。 經(jīng)常有香客問我竖瘾,道長沟突,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任捕传,我火速辦了婚禮惠拭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己职辅,他們只是感情好棒呛,可當(dāng)我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著域携,像睡著了一般簇秒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上秀鞭,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天趋观,我揣著相機與錄音,去河邊找鬼锋边。 笑死皱坛,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的豆巨。 我是一名探鬼主播剩辟,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼往扔!你這毒婦竟也來了贩猎?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤萍膛,失蹤者是張志新(化名)和其女友劉穎吭服,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體卦羡,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡噪馏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年麦到,在試婚紗的時候發(fā)現(xiàn)自己被綠了绿饵。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡瓶颠,死狀恐怖拟赊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情粹淋,我是刑警寧澤吸祟,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站桃移,受9級特大地震影響屋匕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜借杰,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一过吻、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦纤虽、人聲如沸乳绕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽洋措。三九已至,卻和暖如春杰刽,著一層夾襖步出監(jiān)牢的瞬間菠发,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工专缠, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留雷酪,地道東北人。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓涝婉,卻偏偏與公主長得像哥力,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子墩弯,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內(nèi)容