1、前言介紹
1.1 Activiti簡介
Activiti是基于Apache許可的開源BPM平臺,創始人Tom Baeyens原是JBPM架構師,BPM是由Alfresco軟件發布的業務流程管理(BPM)框架,它是覆蓋了業務流程管理、工作流、服務協作等領域的一個開源的、靈活的、易擴展的可執行流程語言框架。
1.2 springboot 整合 Activiti7
activiti7提供了對springboot的場景starter(activiti-spring-boot-starter)和相應的依賴管理的包,所有整合過程相對簡單。
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring-boot-starter</artifactId>
<version>7.1.0.M5</version>
</dependency>
<dependency>
<groupId>org.activiti.dependencies</groupId>
<artifactId>activiti-dependencies</artifactId>
<version>7.1.0.M5</version>
<type>pom</type>
</dependency>
但是,Activiti7默認使用了Spring Security做權限認證,反而不利于使用。
2、Activiti 數據庫表結構
2.1 表名稱說明
表分類 | 分類說明 |
---|---|
act_hi_* | 'hi’表示 history,此前綴的表包含歷史數據,如歷史(結束)流程實例,變量,任務等等。 |
act_ge_* | 'ge’表示 general,此前綴的表為通用數據,用于不同場景中。 |
act_evt_* | 'evt’表示 event,此前綴的表為事件日志。 |
act_procdef_* | 'procdef’表示 processdefine,此前綴的表為記錄流程定義信息。 |
act_re_* | 're’表示 repository,此前綴的表包含了流程定義和流程靜態資源(圖片,規則等等)。 |
act_ru_* | 'ru’表示 runtime,此前綴的表是記錄運行時的數據,包含流程實例,任務,變量,異步任務等運行中的數據。Activiti只在流程實例執行過程中保存這些數據,在流程結束時就會刪除這些記錄。 |
2.2 表注釋
表名 | 表注釋 |
---|---|
act_ge_bytearray | 二進制數據表,存儲通用的流程定義和流程資源。 |
act_ge_property | 系統相關屬性,屬性數據表存儲整個流程引擎級別的數據,初始化表結構時,會默認插入三條記錄。 |
act_re_deployment | 部署信息表 |
act_re_model | 流程設計模型部署表 |
act_re_procdef | 流程定義數據表 |
act_ru_deadletter_job | 作業死亡信息表,作業失敗超過重試次數 |
act_ru_event_subscr | 運行時事件表 |
act_ru_execution | 運行時流程執行實例表 |
act_ru_identitylink | 運行時用戶信息表 |
act_ru_integration | 運行時積分表 |
act_ru_job | 運行時作業信息表 |
act_ru_suspended_job | 運行時作業暫停表 |
act_ru_task | 運行時任務信息表 |
act_ru_timer_job | 運行時定時器作業表 |
act_ru_variable | 運行時變量信息表 |
act_hi_actinst | 歷史節點表 |
act_hi_attachment | 歷史附件表 |
act_hi_comment | 歷史意見表 |
act_hi_detail | 歷史詳情表,提供歷史變量的查詢 |
act_hi_identitylink | 歷史流程用戶信息表 |
act_hi_procinst | 歷史流程實例表 |
act_hi_taskinst | 歷史任務實例表 |
act_hi_varinst | 歷史變量表 |
act_evt_log | 流程引擎的通用事件日志記錄表 |
act_procdef_info | 流程定義的動態變更信息 |
3、Acticiti核心類介紹
類名 | 類說明 |
---|---|
ProcessEngine | 流程引擎的抽象,可以通過此類獲取流程引擎需要的所有服務。 |
Service類 | 通過ProcessEngine獲取,Activiti將不同生命周期的服務封裝在不同Service中,包括定義、部署、運行。通過服務類可獲取相關生命周期中的服務信息。 |
taskService | 流程運行過程中,每個任務節點的相關操作接口,如complete,delete,delegate等。 |
RepositoryService | 流程定義和部署相關的存儲服務 |
RuntimeService | 流程運行時相關的服務,如根據流程好啟動流程實例startProcessInstanceByKey。 |
HistoryService | 歷史記錄相關服務接口。 |
ProcessRuntime | Process相關功能封裝,方便使用,@PreAuthorize("hasRole('ACTIVITI_USER')") |
TaskRuntime | taskService封裝,方便使用,限制權限 |
3、使用流程介紹
微信截圖_20220425165226.png
資源類似java中的類,啟動實例就是類的實例化。
3.1、 部署流程
/**
* 部署流程
*/
repositoryService.createDeployment()
.addClasspathResource("bpm/askForLeaveBpm.bpmn")
.addClasspathResource ("bpm/test.png")
.name("請假流程")
.key("ASK_FOR_LEAVE_ACT")
.deploy();
System.out.println("流程部署成功!");
3.1、啟動一個流程實例
/**
* 啟動流程實例
*/
public void startProcess() {
String processDefinitionKey = "ASK_FOR_LEAVE_ACT";
Map map = new HashMap<> ();
//使用UEL 表達式設置
// 學生填寫申請單 Assignee:${student}
map.put ("student", "lucy");
// 班主任審批 Assignee:${teacher}
map.put ("teacher", "jack");
ProcessInstance instance = runtimeService.startProcessInstanceByKey (processDefinitionKey, map);
System.out.println ("流程實例ID:" + instance.getId ());
System.out.println ("流程定義ID:" + instance.getProcessDefinitionId ());
}
3.1、查詢當前流程中等待執行的任務
/**
* 任務查詢
*/
public List searchTask() {
//流程啟動后,各各任務的負責人就可以查詢自己當前需要處理的任務,查詢出來的任務都是該用戶的待辦任務。
List list = taskService.createTaskQuery ()
//流程實例key
.processDefinitionKey ("test01")
//查詢誰的任務
//.taskAssignee("")
.list ();
List idList = new ArrayList ();
for (Task task : list) {
idList.add (task.getId ());
System.out.println ("任務ID:" + task.getId ());
System.out.println ("任務名稱:" + task.getName ());
System.out.println ("任務的創建時間:" + task.getCreateTime ());
System.out.println ("任務的辦理人:" + task.getAssignee ());
System.out.println ("流程實例ID:" + task.getProcessInstanceId ());
System.out.println ("執行對象ID:" + task.getExecutionId ());
System.out.println ("流程定義ID:" + task.getProcessDefinitionId ());
}
return idList;
}
查詢.png
3.1、處理任務
/**
* 處理任務
*/
public void disposeTask(List list) {
for (String id : list) {
// 任務id
taskService.complete (id);
System.out.println ("處理任務id:" + id);
}
}
審批.png
4、禁用springsecurity
Activiti7默認集成springsecurity權限模塊,啟動服務訪問模塊時,瀏覽器會彈出一個登錄界面,可通過一下設置禁用。
@SpringBootApplication(
exclude = {
org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class,
org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class
})