Spring activiti 入門教程 詳細分析


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 地址:

https://github.com/Caesarthegreat/Spring-activiti-demo.git


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM