activiti工作流入門學習
工作流一般在OA系統用的比較多,當然,只要有流程審批的地方都會用到,activiti只是開源的工作流中比較流行的一個,還有其他的開源的工作流,這裡學習activiti工作流;前面部分是關於activiti的總體的介紹及如何搭建,後半部分使用一個demo演示,清晰直觀的觀察工作流的工作機制及資料庫表的資料變化,對工作流的理解和使用有一個直觀的認識。
一.總體認識
1.介紹
Activiti是一個開源的工作流框架,用的最多的例子就是審批流程,比如員工請假,申請之後提交,然後會提交到經理,經理審批完可能還會部長審批,等一系列流程;還有比如報銷申請,需要先由經理審批,然後由總監審批,最後還要財務審批等,經過一系列事先制定好的流程;當然了,這只是工作流的一個應用,實際工作流還有其他的很多應用;activiti使用起來也比較方便,自動生成25張資料庫表,有8大核心API,通過這些核心API就可以很方便的使用工作流。
2.部署方式
很多將工作流的部落格都比較老,而且都只從自己的一個部署方式去講解,不同的部落格可能使用不同的部署方式,讓初學者感到很懵,不知道到底應該用哪個,其實部署流程資源有很多種方法,包括classpath、InputStream、字串、zip格式壓縮包,不同的部署方式可以根據專案或者自己實現的難易程度進行自由選擇;
因為支援直接載入.bpmn格式的檔案,比較方便,而actiBPMN外掛也正好可以很方便的生成.bpmn格式的檔案,很方便的畫流程圖,所以這就是前面要先安裝actiBPMN外掛原因,畫出流程圖之後,然後部署就行了,所有我使用直接載入.bpmn檔案的方式部署,希望初學者不要在這裡疑惑。
3.使用
使用步驟:部署流程è發起一個流程例項(流程開始)è使用流程(查詢流程、查詢代辦、提交審批、結束流程….等等)
每次修改完流程圖之後,都要重新部署流程;每開始一個(審批流程)新的流程實質就是發起一個流程例項;發起流程之後,整個流程就開始了。
4.資料庫表說明
資料庫表比較多,這裡就不都列舉了,詳情可以網上搜索,有很詳細的說明;
需要主要關注的幾張表:
部署流程階段:ACT_RE_DEPLOYMENT、ACT_RE_PROCDEF
發起流程階段:ACT_RU_EXECUTION、ACT_RU_TASK、ACT_RU_VARIABLE
一個流程例項的發起,在ACT_RU_EXECUTION中才存在,流程例項執行完畢,則該表的該例項資訊就會被自動刪除;
一個流程例項的發起,在ACT_RU_TASK才會有該流程例項的審批相關任務,該表只對應一個流程例項執行到的當前節點的審批資訊,包括審批人和任務id等任務資訊,可以根據審批人查詢其代辦任務,執行完之後便刪除,然後顯示下一審批節點的任務資訊,即只顯示當前節點的任務資訊,這個流程例項執行完畢,則表為空;
一個流程例項的發起,到達一個節點,如果該節點有判斷條件(在流程線上的判斷條件),則判斷條件中的變數會被儲存到ACT_RU_VARIABLE,如果流程例項執行完畢,則該表為空。
5.API說明
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外掛安裝
1.下載外掛
外掛官網:https://plugins.jetbrains.com/plugin/7429-actibpm/versions
下載完成之後,不用解壓,建議放到idea安裝目錄的plugins下:
2.然後從本地安裝外掛,選擇剛才那個外掛包,安裝完畢之後要重啟idea才生效:
安裝完成重啟之後,選擇新建,則可以看見bpmnfile,則說明成功了:
外掛安裝完成了,接下來就可以搭建demo了;
三.demo演示
專案地址:https://github.com/Little-Orange7/activiti-demo
1.搭建一個springboot專案
這是搭建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
2.然後使用actiBPMN外掛在resource目錄下新建bpmn檔案:
用拖拽方式建立一個流程圖:
編輯流程圖節點資訊,assignee隨意指定一個即可,流程啟動後,可以按照這個assignee來查詢該user的代辦任務;
加入判斷條件及判斷變數:
3.主要API的使用
環境準備及框架搭建已經完成,接下來就可以呼叫API來使用工作流;
部署流程:
查詢已部署的全部流程:
發起一個流程:
查詢代辦任務(根據使用者名稱):
提交任務(根據任務id):
4.模擬測試:
下面將使用[我專案的demo](https://github.com/Little-Orange7/activiti-demo)來演示工作流如何使用及對應流程資料表的資料變化;
先模擬節點一審批同意,節點二審批拒絕,觀察資料庫的資料變化;然後在模擬節點一審批同意,節點二審批同意,整個流程結束,觀察資料庫資料變化;
4.1部署流程
對應資料庫表:
4.2發起流程
對應資料庫表:
4.3根據使用者查詢代辦任務
對應資料庫表:
可以觀察到流程在第一個審批節點。
4.4提交任務(第一個節點)
審批同意(message=Y)
提交任務之後,流程到了第二個審批節點
對應的判斷條件的變數及值:
4.5提交任務(第二個節點)
審批拒絕(message=N)
流程又回到節點一了
變數的值變為N
4.6提交任務(節點一審批同意)
此時流程到了節點二
4.7提交任務(節點二審批同意)
到此,此流程例項已經結束了;
任務表已經沒有任務了:
流程例項執行表也沒有例項了:
變量表也沒有變量了:
以上流程執行完成,根據流程和資料的跟蹤,能很清晰的觀察到流程的執行過程,當然這裡只是一個簡單的流程演示,還有很多流程流轉方式需要去學習,待以後更新,希望這篇部落格能幫助你學習activiti,如果有疑問的地方大家留言指出來一起學習探討。
&n