ref: https://blog.csdn.net/ryuenkyo/article/details/83008641
ref: https://blog.csdn.net/clk_esunny/article/details/80336073
1 Activiti介紹
Activiti5是由Alfresco軟件在2010年5月17日發布的業務流程管理(BPM)框架,它是覆蓋了業務流程管理、工作流、服務協作等領域的一個開源的、靈活的、易擴展的可執行流程語言框架。Activiti基於Apache許可的開源BPM平台,創始人Tom Baeyens是JBoss jBPM的項目架構師,它特色是提供了eclipse插件,開發人員可以通過插件直接繪畫出業務。
流程圖。
2 BPMN
業務流程建模與標注(Business Process Model and Notation,BPMN) ,描述流程的基本符號,包括這些圖元如何組合成一個業務流程圖(Business Process Diagram)
3 有什么用 - 為什么要用
很簡單,基本上所有的所謂框架,都是基於某個問題,提出的一套解決方案,給你提供一組API,你調就行了。Activiti把表都給你建了,它不香嗎?
4 怎么用 - 相關基礎知識
1) 5種數據庫表
Activiti的后台是有數據庫的支持,工程一啟動自動建表,所有的表都以ACT_開頭。 第二部分是表示表的用途的兩個字母標識。用途也和服務的API對應,不同的表存放不同方面的數據,有流程定義表、任務結點表、流程變量表、任務歷史表等等。
ACT_RE_*: 'RE'表示repository。 這個前綴的表包含了流程定義和流程靜態資源(圖片,規則,等等)。
ACT_RU_*: 'RU'表示runtime。 這些運行時的表,包含流程實例,任務,變量,異步任務,等運行中的數據。 Activiti只在流程實例執行過程中保存這些數據,在流程結束時就會刪除這些記錄。 這樣運行時表可以一直很小速度很快。
ACT_ID_*: 'ID'表示identity。 這些表包含身份信息,比如用戶,組等等。
ACT_HI_*: 'HI'表示history。 這些表包含歷史數據,比如歷史流程實例,變量,任務等等。
ACT_GE_*: 通用數據,用於不同場景下,如存放資源文件。
23張表:
2) 5項Service
不同的Service類對應不同的功能。
RepositoryService 管理流程定義
RuntimeService 執行管理,包括啟動、推進、刪除流程實例等操作
TaskService 任務管理,是activiti的任務服務類。可以從這個類中獲取任務的信息。
HistoryService 歷史管理(執行完的數據的管理) ,是activiti的查詢歷史信息的類。在一個流程執行完成后,這個對象為我們提供查詢歷史信息
IdentityService 組織機構管理
3) 7項基本操作
設計流程圖(各種組件,如連線、用戶任務、網關)
流程定義增刪改查
流程變量增刪改查
啟動流程定義
任務增刪改查
完成任務
歷史信息查詢
5 工作流程
第一步:流程定義&部署
定義一個新的流程(如:請假流程,外出流程),在eclipse 或IDEA里面安裝bpmn插件,畫一個bpmn流程圖。重啟工程,activiti就在act_re_procdef表中插入一條記錄,即這個新加入的流程。
一個請假的bpmn流程圖如下:
為什么要畫這個流程圖?
說明:流程定義文檔有兩部分組成:
1) bpmn文件
流程規則文件。在部署后,每次系統啟動時都會被解析,把內容封裝成流程定義放入項目緩存中。Activiti框架結合這個xml文件自動管理流程,流程的執行就是按照bpmn文件定義的規則執行的,bpmn文件是給計算機執行用的。 解析.bpmn后得到的流程定義規則的信息,工作流系統就是按照流程定義的規則執行的。
2) 展示流程圖的圖片
在系統里需要展示流程的進展圖片,圖片是給用戶看的。activiti通過這個圖可以追蹤到當前流程走到哪一步了(這是工作流軟件基本的業務需求)。
在審批過程中的請假流程,如下圖(當前走到人事審批這一步):
第二步:啟動流程
這一步是需要開發者來實現的,拿我們日常請假來說,每當你提交了一個請假的申請,就會觸發activiti流程控制的相關業務,拿上圖的請假流程來說,當你提交一個申請,activiti就自動把流程推進到 部門領導審批 這一步。
相關代碼:
1 public ProcessInstance startWorkflow(GooutApply apply, String userid, Map<String, Object> variables) { 2 apply.setApply_time(new Date().toString()); 3 apply.setUser_id(userid); 4 gooutmapper.save(apply); 5 String businesskey=String.valueOf(apply.getId());//使用leaveapply表的主鍵作為businesskey,連接業務數據和流程數據
6 identityservice.setAuthenticatedUserId(userid); 7 // 第一個參數:bpmn流程圖的key 第二個參數:業務類的主鍵
8 ProcessInstance instance=runtimeservice.startProcessInstanceByKey("goout",businesskey,variables); 9 System.out.println(businesskey); 10 String instanceid=instance.getId(); 11 apply.setProcess_instance_id(instanceid); 12 gooutmapper.updateByPrimaryKey(apply); 13 return instance; 14 }
核心代碼:runtimeservice.startProcessInstanceByKey("goout",businesskey,variables);
第一個參數:bpmn流程圖的key 第二個參數:業務類的主鍵,activiti通過這個方法把業務(leaveapply)和流程(流程圖的key - act_re_procdef)關聯起來
runtimeservice是activiti的內部對象,直接注入就可用
這一步,在DB層面插入了相關表:act_ru_execution act_ru_task
act_hi_procinst act_hi_actinst act_hi_taskinst等
第三步:流式審批
不同角色的人依次登錄系統,看到並審批和自己角色對應的待辦任務,直到整個流程走完。主要更新表act_ru_task。A在審批前能看到記錄,審批完就看不見了,因為流程已經走到了下一個人那里。
第四步:查看執行結果
審批發起人可以看到自己的審批到底走到哪個階段了(紅色框和紅色箭頭標記),即整個流程的審批情況。
6 相關問題
1) 如何畫bpmn圖?
推薦用eclipse畫,idea對bpmn的支持不友好。
第一步:安裝bpmn插件
在Eclipse的菜單中打開help -> install new software:
單擊add:
Name: Activiti BPMN 2.0 designer
Location: http://activiti.org/designer/update/
第二步:拖拽組件,畫圖
第三步:配置組件屬性
當前bpmn圖的屬性:
Task的屬性:
Candidate group屬性:這個屬性很關鍵,代表哪個角色可以看到當前的task。
gateway的配置:
下圖的Condition屬性很重要,是用來控制流程走向的條件,即當deptleaderapprove_goout(在完成任務時,通過map傳值)為true時,從部門領導審批走到人事審批。
審批時寫的同意 & 拒絕存進act_ru/hi_variable,在畫bpmn圖時,根據act_ru/hi_variable中的值和bpmn圖中的<sequenceFlow>匹配,決定畫出的圖是什么樣子的
相關代碼:
1 public MSG deptcomplete_goout(HttpSession session, @PathVariable("taskid") String taskid, HttpServletRequest req) { 2 String userid = (String) session.getAttribute("username"); 3 Map<String, Object> variables = new HashMap<String, Object>(); 4 // 審批意見:同意,拒絕
5 String approve = req.getParameter("deptleaderapprove_goout"); 6 variables.put("deptleaderapprove_goout", approve); 7 taskservice.claim(taskid, userid); 8 // 提交審批
9 taskservice.complete(taskid, variables); 10 return new MSG("success"); 11 }
7 源碼git 地址: