工做流通常在OA系統用的比較多,固然,只要有流程審批的地方都會用到,activiti只是開源的工做流中比較流行的一個,還有其餘的開源的工做流,這裏學習activiti工做流;前面部分是關於activiti的整體的介紹及如何搭建,後半部分使用一個demo演示,清晰直觀的觀察工做流的工做機制及數據庫表的數據變化,對工做流的理解和使用有一個直觀的認識。java
Activiti是一個開源的工做流框架,用的最多的例子就是審批流程,好比員工請假,申請以後提交,而後會提交到經理,經理審批完可能還會部長審批,等一系列流程;還有好比報銷申請,須要先由經理審批,而後由總監審批,最後還要財務審批等,通過一系列事先制定好的流程;固然了,這只是工做流的一個應用,實際工做流還有其餘的不少應用;activiti使用起來也比較方便,自動生成25張數據庫表,有8大核心API,經過這些核心API就能夠很方便的使用工做流。mysql
不少將工做流的博客都比較老,並且都只從本身的一個部署方式去講解,不一樣的博客可能使用不一樣的部署方式,讓初學者感到很懵,不知道到底應該用哪一個,其實部署流程資源有不少種方法,包括classpath、InputStream、字符串、zip格式壓縮包,不一樣的部署方式能夠根據項目或者本身實現的難易程度進行自由選擇;git
由於支持直接加載.bpmn格式的文件,比較方便,而actiBPMN插件也正好能夠很方便的生成.bpmn格式的文件,很方便的畫流程圖,因此這就是前面要先安裝actiBPMN插件緣由,畫出流程圖以後,而後部署就好了,全部我使用直接加載.bpmn文件的方式部署,但願初學者不要在這裏疑惑。github
使用步驟:部署流程è發起一個流程實例(流程開始)è使用流程(查詢流程、查詢代辦、提交審批、結束流程….等等)web
每次修改完流程圖以後,都要從新部署流程;每開始一個(審批流程)新的流程實質就是發起一個流程實例;發起流程以後,整個流程就開始了。spring
數據庫表比較多,這裏就不都列舉了,詳情能夠網上搜索,有很詳細的說明;sql
須要主要關注的幾張表:數據庫
部署流程階段:ACT_RE_DEPLOYMENT、ACT_RE_PROCDEF瀏覽器
發起流程階段:ACT_RU_EXECUTION、ACT_RU_TASK、ACT_RU_VARIABLEspringboot
一個流程實例的發起,在ACT_RU_EXECUTION中才存在,流程實例執行完畢,則該表的該實例信息就會被自動刪除;
一個流程實例的發起,在ACT_RU_TASK纔會有該流程實例的審批相關任務,該表只對應一個流程實例執行到的當前節點的審批信息,包括審批人和任務id等任務信息,能夠根據審批人查詢其代辦任務,執行完以後便刪除,而後顯示下一審批節點的任務信息,即只顯示當前節點的任務信息,這個流程實例執行完畢,則表爲空;
一個流程實例的發起,到達一個節點,若是該節點有判斷條件(在流程線上的判斷條件),則判斷條件中的變量會被存儲到ACT_RU_VARIABLE,若是流程實例執行完畢,則該表爲空。
RepositoryService 流程倉庫Service,能夠管理流程倉庫例如部署刪除讀取流程資源
RuntimeService 運行時Service能夠處理全部運行狀態的流程實例流程控制(開始,暫停,掛起等)
TaskService 任務Service用於管理、查詢任務,例如簽收、辦理、指派等
IdentitiServicec 身份Service能夠管理查詢用戶、組之間的關係
FormService 表單Service用於讀取和流程、任務相關的表單數據
HistoryService 歷史Service用於查詢全部的歷史數據
ManagementService 引擎管理Service,和具體業務無關,主要查詢引擎配置,數據庫做業
DynamicBpmService 動態bpm服務
須要重點關注的三個主要API:
RepositoryService:流程倉儲的管理,能夠讀取流程資源、部署、查詢已部署的流程、刪除等;(相似java的類)。
RuntimeService:流程實例的發起及流程實例的管理等;(相似java的類的實例)。
TaskService:流程實例中的任務管理,例如代辦任務查詢、辦理、指派等;(相似java類的實例的方法和參數值)。
個人開發環境:
Idea(2019.3.3),springboot(2.2.7),activiti7,mybatis(2.1.2), druid(1.1.10);
idea的actiBPMN插件安裝
插件官網:https://plugins.jetbrains.com/plugin/7429-actibpm/versions
下載完成以後,不用解壓,建議放到idea安裝目錄的plugins下:
安裝完成重啓以後,選擇新建,則能夠看見bpmnfile,則說明成功了:
插件安裝完成了,接下來就能夠搭建demo了;
項目地址:https://github.com/Little-Orange7/activiti-demo
這是搭建springboot的步驟,後面的比較簡單,就省略了。
來看下項目的依賴:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.2</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.10</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-spring-boot-starter</artifactId> <version>7.1.0.M2</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> </dependencies>
application.propertities配置:
#server server.port=8088 server.compression.enabled=true #datasource spring.datasource.type=com.alibaba.druid.pool.DruidDataSource spring.datasource.username=root spring.datasource.password=root spring.datasource.url=jdbc:mysql://localhost:3306/cmms?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true #activiti7默認是不自動生成8張歷史記錄表的,這裏設置開啓 #spring.activiti.db-history-used=true #spring.activiti.history-level=audit
遇到的問題:
1.啓動報錯,緣由是啓動時沒有自動建立activiti表,因此沒有查詢到相關表;
解決:在數據庫鏈接池的url上加上:nullCatalogMeansCurrent=true
2.項目啓動只建立了17張表,沒有建立25張表,緣由是activiti7默認是不建立歷史記錄
表的(對整個工做流的執行沒有影響,只是不會生成歷史記錄);
解決:若是要生成歷史記錄表,要主動打開,在配置中加入
spring.activiti.db-history-used=true spring.activiti.history-level=audit
3.activiti7默認整合了spring security,因此若是直接在瀏覽器中訪問,是須要先登陸的;
解決:爲了只測試activiti,這裏能夠先把spring security屏蔽掉,在啓動類加上這個:
@SpringBootApplication(exclude = {//activiti7集成了springSecurity,此處暫時屏蔽掉 org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class })
這時候啓動,不報錯,查看數據庫,能夠看見已經生成了25張表,說明啓動成功。
而後建立相應模塊:
項目地址:https://github.com/Little-Orange7/activiti-demo
用拖拽方式建立一個流程圖:
編輯流程圖節點信息,assignee隨意指定一個便可,流程啓動後,能夠按照這個assignee來查詢該user的代辦任務;
加入判斷條件及判斷變量:
環境準備及框架搭建已經完成,接下來就能夠調用API來使用工做流;
部署流程:
查詢已部署的所有流程:
發起一個流程:
查詢代辦任務(根據用戶名):
提交任務(根據任務id):
下面將使用[我項目的demo](https://github.com/Little-Orange7/activiti-demo)來演示工做流如何使用及對應流程數據表的數據變化;
先模擬節點一審批贊成,節點二審批拒絕,觀察數據庫的數據變化;而後在模擬節點一審批贊成,節點二審批贊成,整個流程結束,觀察數據庫數據變化;
對應數據庫表:
對應數據庫表:
對應數據庫表:
能夠觀察到流程在第一個審批節點。
審批贊成(message=Y)
提交任務以後,流程到了第二個審批節點
對應的判斷條件的變量及值:
審批拒絕(message=N)
流程又回到節點一了
變量的值變爲N
此時流程到了節點二
到此,此流程實例已經結束了;
任務表已經沒有任務了:
流程實例執行表也沒有實例了:
變量表也沒有變量了:
以上流程執行完成,根據流程和數據的跟蹤,能很清晰的觀察到流程的執行過程,固然這裏只是一個簡單的流程演示,還有不少流程流轉方式須要去學習,待之後更新,但願這篇博客能幫助你學習activiti,若是有疑問的地方你們留言指出來一塊兒學習探討。