本文已收錄在Github,關注我,緊跟本系列專欄文章,咱們下篇再續!
- ?? 魔都架構師 | 全網30W技術追隨者
- ?? 大廠分布式系統/數據中臺實戰專家
- ?? 主導交易系統百萬級流量調優 & 車聯網平臺架構
- ?? AIGC應用開發先行者 | 區塊鏈落地實踐者
- ?? 以技術驅動創新,我們的征途是改變世界!
- ?? 實戰干貨:編程嚴選網
0 目標
Java項目集成 Activiti7 完成一個簡單工作流。
1 添加依賴
添加Activiti7依賴:
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring-boot-starter</artifactId>
<version>7.1.0.M4</version>
</dependency>
<dependency>
<groupId>org.activiti.dependencies</groupId>
<artifactId>activiti-dependencies</artifactId>
<version>7.1.0.M4</version>
<type>pom</type>
</dependency>
2 Activiti7經典類
- 任務處理Task
- 歷史任務HistoricTaskInstance:代表一個歷史悠久的任務實例(等待,完成或刪除),該實例被存儲為統計,審計和其他商業智能目的的永久存儲
- 流程部署Deployment
- 流程定義ProcessDefinition
- 流程實例Processlnstance
3 流程部署Deployment
// 通過bpmn部署流程
@Test
public void initDeploymentBPMN() {
String filename = "BPMN/Part4_Task_claim.bpmn";
Deployment deployment = repoService.createDeployment()
.addClasspathResource(filename)
.name("流程部署測試候選人task")
.deploy();
System.out.println(deployment.getName());
}
看到表里剛創的數據ACT_RE_DEPLOYMENT:
二進制文件保存的表ACT_GE_BYTEARRAY:
咋讓別人看到你畫的圖?
同時生成一個圖片即可。但其實.bpmn文件就能用bpmn.js插件渲染出來了。
//通過bpmn部署流程
@Test
public void initDeploymentBPMN() {
String filename = "BPMN/Part4_Task_claim.bpmn";
String pngname="BPMN/Part1_Deployment.png";
Deployment deployment = repoService.createDeployment()
.addClasspathResource(filename)
.addClasspathResource(pngname)//圖片
.name("流程部署測試V1")
.deploy();
System.out.println(deployment.getName());
}
這就說明同屬于一個部署:
部署一個 zip
//通過ZIP部署流程
@Test
public void initDeploymentZIP() {
InputStream fileInputStream = this.getClass()
.getClassLoader()
.getResourceAsStream("BPMN/Part1_DeploymentV2.zip");
ZipInputStream zip = new ZipInputStream(fileInputStream);
Deployment deployment = repoService.createDeployment()
.addZipInputStream(zip)
.name("流程部署測試zip")
.deploy();
System.out.println(deployment.getName());
}
最終生成的是什么呢?沒錯,zip 里的 兩個文件,同屬于一個部署:
4 流程定義ProcessDefinition
和 deploymentid 其實一對一:(ID_ 就是 key+部署次數版本+id)
既不是因為表的字段太多,也不是因為一對多,就是設計成了一對一關系。
查詢流程定義
@Test
public void getDefinitions() {
List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery()
.list();
for (ProcessDefinition pd : list) {
System.out.println("------流程定義--------");
System.out.println("Name:" + pd.getName());
System.out.println("Key:" + pd.getKey());
System.out.println("ResourceName:" + pd.getResourceName());
System.out.println("DeploymentId:" + pd.getDeploymentId());
System.out.println("Version:" + pd.getVersion());
}
}
刪除流程定義
@Test
public void delDefinition() {
String pdID = "44b15cfe-ce3e-11ea-92a3-dcfb4875e032";
repositoryService.deleteDeployment(pdID, true);
System.out.println("刪除流程定義成功");
}
- Deployment:添加資源文件、獲取部署信息、部署時間
- ProcessDefinition:獲取版本號、 key、資源名稱、部署ID等
5 流程實例ProcessInstance
ProcessDefinition與ProcessInstance是一對多關系,理解為:行動計劃與具體行動的關系。
5.1 初始化流程實例
需要的就是一個流程的 key:
@Test
public void initProcessInstance(){
// 1、獲取頁面表單填報的內容,請假時間,請假事由,String fromData
// 2、fromData 寫入業務表,返回業務表主鍵ID==businessKey
// 3、把業務數據與Activiti7流程數據關聯
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcess_claim","bKey002");
System.out.println("流程實例ID:"+processInstance.getProcessDefinitionId());
}
5.2 獲取流程實例列表
//
@Test
public void getProcessInstances(){
List<ProcessInstance> list = runtimeService.createProcessInstanceQuery().list();
for(ProcessInstance pi : list){
System.out.println("--------流程實例------");
System.out.println("ProcessInstanceId:"+pi.getProcessInstanceId());
System.out.println("ProcessDefinitionId:"+pi.getProcessDefinitionId());
System.out.println("isEnded"+pi.isEnded());
System.out.println("isSuspended:"+pi.isSuspended());
}
}
5.3 暫停與激活流程實例
@Test
public void activitieProcessInstance(){
// runtimeService.suspendProcessInstanceById("73f0fb9a-ce5b-11ea-bf67-dcfb4875e032");
//System.out.println("掛起流程實例");
runtimeService.activateProcessInstanceById("73f0fb9a-ce5b-11ea-bf67-dcfb4875e032");
System.out.println("激活流程實例");
}
5.4 刪除流程實例
@Test
public void delProcessInstance(){
runtimeService.deleteProcessInstance("73f0fb9a-ce5b-11ea-bf67-dcfb4875e032","刪著玩");
System.out.println("刪除流程實例");
}
6 任務
6.1 任務的類型
任務的圖形化是以矩形為基礎,在左側添加具體的圖標,用來描述一種特定任務類型。
用戶任務需要人來參與,需要人為觸發。
6.2 關鍵屬性
關注用戶任務:
- Assignee:執行人/代理人
- Candidate Users:候選人 誰先拾取任務,誰來執行任務
- Candidate Groups:候選組
- Due Date:任務到期時間
下面串起這些概念:
7 報銷流程設計
7.1 bpmn設計
豬頭三發起了報銷請求:
JavaEdge 審核報銷請求:
注意流程 id 名為:myProcess_Task,
7.2 bpmn部署
先bpmn部署該流程:
public void startDeploymentBPMN() {
String filename = "BPMN/Part4_Task.bpmn";
Deployment deployment = repoService.createDeployment()
.addClasspathResource(filename)
.name("Part4_Task")
.deploy();
}
7.3 啟動流程
再啟動一個這樣的流程實例:
public void initProcessInstance(){
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcess_Task","bKey002");
}
最后,我們來查詢任務執行情況:
7.4 任務查詢
@Test
public void getTasks(){
List<Task> list = taskService.createTaskQuery().list();
for(Task tk : list){
System.out.println("Id:"+tk.getId());
System.out.println("Name:"+tk.getName());
System.out.println("Assignee:"+tk.getAssignee());
}
}
output:
Id:9ec8d75e-9b86-11ef-8c93-a202cf5d45d9
Name:發起報銷
Assignee:豬頭三
該全量任務列表方法一般是由管理員查看任務執行情況。
查詢我的代辦任務
@Test
public void getTasksByAssignee(){
List<Task> list = taskService.createTaskQuery()
.taskAssignee("豬頭三")
.list();
for(Task tk : list){
System.out.println("Id:"+tk.getId());
System.out.println("Name:"+tk.getName());
System.out.println("Assignee:"+tk.getAssignee());
}
}
output:
Id:9ec8d75e-9b86-11ef-8c93-a202cf5d45d9
Name:發起報銷
Assignee:豬頭三
配置流程引擎
創建一個 ProcessEngineConfiguration
實例來初始化流程引擎:
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
public class ActivitiConfig {
public static ProcessEngine buildProcessEngine() {
ProcessEngineConfiguration config = ProcessEngineConfiguration
.createStandaloneInMemProcessEngineConfiguration();
config.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
config.setJdbcUrl("jdbc:h2:mem:activiti;DB_CLOSE_DELAY=1000");
config.setJdbcDriver("org.h2.Driver");
config.setJdbcUsername("sa");
config.setJdbcPassword("");
return config.buildProcessEngine();
}
}
上面的代碼創建了一個內存數據庫中的流程引擎配置,這在開發和測試階段非常便捷。
本文由博客一文多發平臺 OpenWrite 發布!