activiti工作流引擎入門(mén)教程

activiti簡(jiǎn)介

Activiti項(xiàng)目是一項(xiàng)新的基于Apache許可的開(kāi)源BPM平臺(tái)埠巨,從基礎(chǔ)開(kāi)始構(gòu)建睁冬,旨在提供支持新的BPMN 2.0標(biāo)準(zhǔn)镐确。
Activiti是一種輕量級(jí)祥诽,可嵌入的BPM引擎,而且還設(shè)計(jì)適用于可擴(kuò)展的云架構(gòu)伐庭。 Activiti將提供寬松的Apache許可2.0粉渠,同時(shí)促進(jìn)Activiti BPM引擎和BPMN 2.0的匹配分冈。

activiti的7大馬車(chē)

1.RepositoryService:提供一系列管理流程部署和流程定義的API。
2.RuntimeService:在流程運(yùn)行時(shí)對(duì)流程實(shí)例進(jìn)行管理與控制霸株。
3.TaskService:對(duì)流程任務(wù)進(jìn)行管理雕沉,例如任務(wù)提醒、任務(wù)完成和創(chuàng)建任務(wù)等去件。
4.IdentityService:提供對(duì)流程角色數(shù)據(jù)進(jìn)行管理的API坡椒,這些角色數(shù)據(jù)包括用戶組、用戶及它們之間的關(guān)系尤溜。
5.ManagementService:提供對(duì)流程引擎進(jìn)行管理和維護(hù)的服務(wù)倔叼。
6.HistoryService:對(duì)流程的歷史數(shù)據(jù)進(jìn)行操作,包括查詢宫莱、刪除這些歷史數(shù)據(jù)丈攒。
7.FormService:表單服務(wù)。

activiti應(yīng)用場(chǎng)景

多人協(xié)作的(或者需要?jiǎng)討B(tài)變動(dòng))的業(yè)務(wù)流程場(chǎng)景授霸。

正文

本文將通過(guò)搭建一個(gè)簡(jiǎn)單的請(qǐng)假流程系統(tǒng)來(lái)進(jìn)行講解巡验。

如你所知,activiti工作流引擎多運(yùn)用于流程性很強(qiáng)的業(yè)務(wù)系統(tǒng)碘耳。所以運(yùn)用的第一步是創(chuàng)建.bpmn文件(我稱之為activiti認(rèn)識(shí)的流程圖)


activiti流程圖

.bpmn文件我們可以通過(guò)編輯軟件打開(kāi)


,bpmn文件

可以簡(jiǎn)單的認(rèn)為就是一個(gè)xml文件显设,activiti去解析這個(gè)文件,了解我們到底想干什么事辛辨。
畫(huà)完流程圖之后捕捂,就是我上面提到的activiti七架馬車(chē)。它們就是activiti對(duì)外提供的接口斗搞。通過(guò)它們就可以很方便的操作到activiti生產(chǎn)的數(shù)據(jù)指攒,以及操作它在適當(dāng)?shù)墓?jié)點(diǎn)做想讓它做的事。

我這邊是通過(guò)springboot搭建僻焚。所以需要把那七大馬車(chē)注入(也不一定要全部注入)幽七,交給spring管理。這樣就可以隨便用了溅呢。
以下是注入馬車(chē)代碼

package com.ysh.activiti.config;

import javax.sql.DataSource;

import org.activiti.engine.HistoryService;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ActivitiConfog {
  @Autowired
  private DataSource dataSource;

  @Bean
  public StandaloneProcessEngineConfiguration processEngineConfiguration() {
      StandaloneProcessEngineConfiguration configuration = new StandaloneProcessEngineConfiguration();
      configuration.setDataSource(dataSource);
      >configuration.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
      configuration.setAsyncExecutorActivate(false);
      return configuration;
  }

  @Bean
  public ProcessEngine processEngine() {
      return processEngineConfiguration().buildProcessEngine();
  }

  @Bean
  public RepositoryService repositoryService() {
      return processEngine().getRepositoryService();
  }

  @Bean
  public RuntimeService runtimeService() {
      return processEngine().getRuntimeService();
  }

  @Bean
  public TaskService taskService() {
      return processEngine().getTaskService();
  }
  @Bean
  public HistoryService historyService() {
      return processEngine().getHistoryService();
  }
}

當(dāng)然我這邊并沒(méi)有注入所有的馬車(chē),用到的是時(shí)候再加都是可以的猿挚。這兒也隨帶對(duì)activiti做了基本的配置咐旧。
配置了數(shù)據(jù)源,自動(dòng)建表绩蜻,是否激活A(yù)syncExecutor铣墨。剛剛介紹了其他馬車(chē),忘了activiti 最重要的ProcessEngine(流程引擎對(duì)象)办绝,馬車(chē)都是由它管理伊约。
配置好這些姚淆,運(yùn)行代碼就會(huì)產(chǎn)生activiti的內(nèi)置表。


activiti內(nèi)置表

上圖已a(bǔ)ct開(kāi)頭的都是屡律,總共28張腌逢。每張表含義以及表里的字段含義,我這里就不在累贅超埋,大家網(wǎng)上都能找到資料搏讶。我就這點(diǎn)一哈我認(rèn)為比較重要的表
1.act_ru_execution 執(zhí)行對(duì)象表
2.act_ru_task 用戶任務(wù)表
3.act_hi_actinst 活動(dòng)節(jié)點(diǎn)歷史表
4.act_hi_procinst 流程實(shí)例歷史表
5.act_hi_taskinst 歷史任務(wù)表
下面就說(shuō)怎么去啟動(dòng)一個(gè)流程

Deployment deploy = >repositoryService.createDeployment().addClasspathResource("processes/leave.bpmn").deploy();
// 獲取流程定義
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
              .deploymentId(deploy.getId()).singleResult();
// 啟動(dòng)流程定義,返回流程實(shí)例
ProcessInstance pi = runtimeService.startProcessInstanceById(processDefinition.getId());

到此霍殴,入門(mén)就算結(jié)束了媒惕。

搭建的注意點(diǎn)

我搭建時(shí)考慮的問(wèn)題:
1.activiti流程怎么和自己的業(yè)務(wù)表,如請(qǐng)假詳細(xì)信息表来庭,審批信息表關(guān)聯(lián)起來(lái)妒蔚?
2.activiti如何知道那些任務(wù)該由誰(shuí)處理?
3.駁回月弛,撤銷(xiāo)(目前未搞撤銷(xiāo)功能肴盏,文章還會(huì)持續(xù)更新)怎么實(shí)現(xiàn)?
解決方式 :
1.問(wèn)題一尊搬,網(wǎng)上說(shuō)的可以把流程與業(yè)務(wù)通過(guò)activiti的businesss_key關(guān)聯(lián)起來(lái)叁鉴。后來(lái)我發(fā)現(xiàn)好像這個(gè)值一次流程只能設(shè)置一次(也有可能是我操作不對(duì)),最終我選擇了在業(yè)務(wù)表存儲(chǔ)流程實(shí)例的id來(lái)進(jìn)行關(guān)聯(lián)佛寿。
問(wèn)題二:指定任務(wù)候選人方式解決幌墓。指定候選人的時(shí)候,我一開(kāi)始采用監(jiān)聽(tīng)的方式冀泻,因?yàn)槲疫@邊設(shè)計(jì)的是某個(gè)角色下的人都會(huì)有某個(gè)流程節(jié)點(diǎn)的審批權(quán)限常侣,通過(guò)監(jiān)聽(tīng)的方式,我一開(kāi)始又直接選擇監(jiān)聽(tīng)類弹渔,具體操作如下:


直接選擇監(jiān)聽(tīng)類

發(fā)現(xiàn)這種方式不能獲取到spring管理的bean胳施。
后面嘗試使用expression。這種方式可以獲取到bean肢专。由于我要操作數(shù)據(jù)庫(kù)查詢數(shù)據(jù)舞肆,所以注入了JpaRepository。然后神奇的爆了序列化問(wèn)題博杖。
最后我選擇了傳參的方式指定候選人椿胯。


變量指定候選人

3.駁回:使用排他網(wǎng)關(guān)實(shí)現(xiàn),只需要指定通過(guò)條件
流程線指定條件

由于代碼量還是有點(diǎn)多剃根,后面我code review之后(現(xiàn)在寫(xiě)的還是有點(diǎn)糙)會(huì)放到github上哩盲。有興趣的朋友可以持續(xù)關(guān)注。

系統(tǒng)展示

系統(tǒng)用戶角色表設(shè)計(jì)


系統(tǒng)角色劃分

用戶的信息

用戶與角色關(guān)系

當(dāng)然大家從名字也能大致猜出對(duì)應(yīng)角色。


系統(tǒng)登錄頁(yè)

普通員工登錄界面

發(fā)布申請(qǐng)

填寫(xiě)之后

查看流程

通過(guò)上文流程圖廉油,可以知道請(qǐng)假不大于五天都是部門(mén)經(jīng)理審批惠险。
上文的黑色,表示已經(jīng)提交到經(jīng)理審核抒线,但是經(jīng)理還未處理班巩。


申請(qǐng)6天

大于五天,總監(jiān)審批

部門(mén)經(jīng)理yshManager審批

部門(mén)經(jīng)理YshManager2審批

同一個(gè)任務(wù)十兢,身為部門(mén)經(jīng)理的人都能進(jìn)行審批趣竣。說(shuō)明傳參的方式制定審核人事沒(méi)有問(wèn)題的。
部門(mén)經(jīng)理yshManager2審批之后的流程

我這邊審核任務(wù)設(shè)置的是一個(gè)人審批過(guò)后旱物,就算審批通過(guò)遥缕,不需要所有人審批通過(guò)。當(dāng)時(shí)一個(gè)部門(mén)經(jīng)理審批過(guò)后宵呛,其他部門(mén)經(jīng)理就不能審核這個(gè)任務(wù)单匣,同時(shí)我這邊也設(shè)計(jì)的是無(wú)法再進(jìn)行查看這個(gè)請(qǐng)假任務(wù)具體情況。
人事審核同理宝穗。
人事順利審批

一次性走完流程的流程進(jìn)度

審批拒絕

我就不挨著截圖了户秤,直接展示一個(gè)多次遭拒絕的情況截圖。
image.png

這兒就是多次審批遭拒逮矛,然后重新申請(qǐng)的情況鸡号。這兒就會(huì)有一個(gè)問(wèn)題,我開(kāi)始申請(qǐng)請(qǐng)假是6天须鼎。被總監(jiān)拒絕鲸伴。我改為5天,被人力資源拒絕晋控。后面改3天汞窗,審批通過(guò)。由于我申請(qǐng)審批一直是操作的同一條申請(qǐng)請(qǐng)假數(shù)據(jù)赡译。導(dǎo)致前面的數(shù)據(jù)記錄丟失仲吏。(bug后續(xù)更新解決)

結(jié)語(yǔ)

我對(duì)activiti也是剛接觸的小白。如有不正確之處蝌焚,請(qǐng)不吝賜教裹唆。后面還會(huì)持續(xù)更新。有興趣的朋友可以持續(xù)關(guān)注只洒。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末品腹,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子红碑,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件析珊,死亡現(xiàn)場(chǎng)離奇詭異羡鸥,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)忠寻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)惧浴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人奕剃,你說(shuō)我怎么就攤上這事衷旅。” “怎么了纵朋?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵柿顶,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我操软,道長(zhǎng)嘁锯,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任聂薪,我火速辦了婚禮家乘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘藏澳。我一直安慰自己仁锯,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布翔悠。 她就那樣靜靜地躺著业崖,像睡著了一般。 火紅的嫁衣襯著肌膚如雪凉驻。 梳的紋絲不亂的頭發(fā)上腻要,一...
    開(kāi)封第一講書(shū)人閱讀 49,079評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音涝登,去河邊找鬼雄家。 笑死,一個(gè)胖子當(dāng)著我的面吹牛胀滚,可吹牛的內(nèi)容都是我干的趟济。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼咽笼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼顷编!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起剑刑,我...
    開(kāi)封第一講書(shū)人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤媳纬,失蹤者是張志新(化名)和其女友劉穎双肤,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體钮惠,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡茅糜,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了素挽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蔑赘。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖预明,靈堂內(nèi)的尸體忽然破棺而出缩赛,到底是詐尸還是另有隱情,我是刑警寧澤撰糠,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布酥馍,位于F島的核電站,受9級(jí)特大地震影響窗慎,放射性物質(zhì)發(fā)生泄漏物喷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一遮斥、第九天 我趴在偏房一處隱蔽的房頂上張望峦失。 院中可真熱鬧,春花似錦术吗、人聲如沸尉辑。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)隧魄。三九已至,卻和暖如春隘蝎,著一層夾襖步出監(jiān)牢的瞬間购啄,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工嘱么, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留狮含,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓曼振,卻偏偏與公主長(zhǎng)得像几迄,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子冰评,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345