基本流程講解與開發前奏
核心API介紹
springboot環境下不再以activiti.cfg.xml文件的形式配置,可在yml內配置,yml配置會在後文講解。
RepositoryService:對流程定義進行管理。
RuntimeService:對流程實例的管理。
TaskService:對流程任務進行管理。
IdentityService:管理用戶和用戶組。
ManagementService:提供對activiti數據庫的直接訪問【一般不用】。
HistoryService:對流程的歷史數據進行操作。
FormService:動態表單。
Activiti6 YML配置
1.加入配置
spring:
activiti:
database-schema-update: false
check-process-definitions: false
activiti使用starter配置後屬於spring下。
check-process-definitions【檢查Activiti數據表是否存在及版本號是否匹配】默認爲true,自動創建好表之後設爲false。設爲false會取消自動部署功能。
database-schema-update【在流程引擎啓動和關閉時處理數據庫模式】如下(摘自官網)
- false (默認值):在創建流程引擎時檢查庫模式的版本,如果版本不匹配則拋出異常。
- true:在創建流程引擎時,執行檢查並在必要時對數據庫中所有的表進行更新,如果表不存在,則自動創建。
- create-drop:在創建流程引擎時,會創建數據庫的表,並在關閉流程引擎時刪除數據庫的表。
準備步驟
1.測試項目結構:主要爲做工作流部署的兩種形式,zip爲bpmn與png文件的壓縮文件
2.安裝eclipse activiti插件
https://www.cnblogs.com/mingforyou/p/5347561.html【百度找了一個老哥的,這個就你們自己去倒騰了。難度不大】
3.流程圖如下
代碼後續用到功能時會貼出
RepositoryService
打開測試類
部署流程定義
/**部署流程定義*/
@Test
public void deploy(){
Deployment deployment = repositoryService.createDeployment()//創建一個部署對象
.name("helloworld入門程序")
.addClasspathResource("bpmn/MyProcess.bpmn")//從classpath的資源中加載,一次只能加載一個文件
.addClasspathResource("bpmn/MyProcess.png")
.deploy();
System.out.println("部署ID:"+deployment.getId());
System.out.println("部署名稱:"+deployment.getName());
}
部署過程同時會影響三張表的數據
ACT_RE_DEPLOYMENT(第二行)
ACT_GE_BYTEARRAY(文件會被存在這張表內,activiti以縱表方式存儲數據)
ACT_RE_PROCDEF
部署流程定義(zip)
/**部署流程定義(zip) */
@Test
public void deployzip() throws IOException{
InputStream in = this.getClass().getClassLoader().getResourceAsStream("bpmn/MyProcess.zip");
ZipInputStream zipInputStream = new ZipInputStream(in);
Deployment deployment = repositoryService.createDeployment()
.name("helloworld入門程序2")
.addZipInputStream(zipInputStream)//指定zip格式的文件完成部署
.deploy();//完成部署
System.out.println("部署ID:"+deployment.getId());
System.out.println("部署名稱:"+deployment.getName());
zipInputStream.close();
}
【PS:流程實例可以重複部署,有版本號作爲標識】
刪除流程定義
/**刪除流程定義*/
@Test
public void deleteProcess(){
String deploymentId = "25001";
/**不帶級聯的刪除:只能刪除沒有啓動的流程,如果流程啓動,就會拋出異常*/
// repositoryService.deleteDeployment(deploymentId);
/**級聯刪除:不管流程是否啓動,都能可以刪除(emmm大概是一鍋端)*/
repositoryService.deleteDeployment(deploymentId, true);
System.out.println("刪除成功!");
}
RuntimeService
【多個流程實例之間不會相互影響】
注入Service
啓動流程實例
/**啓動流程實例*/
@Test
public void startProcessInstance(){
//流程定義的key
String processDefinitionKey = "myProcess";
//key對應MyProcess.bpmn文件中id的屬性值,使用key值啓動,默認是按照最新版本的流程定義啓動
ProcessInstance pi = runtimeService.startProcessInstanceByKey(processDefinitionKey);
System.out.println("流程實例ID:"+pi.getId());//流程實例ID
System.out.println("流程定義ID:"+pi.getProcessDefinitionId());//流程定義ID
}
查詢流程實例
/**查詢流程實例*/
@Test
public void searchProcessInstance(){
String processDefinitionKey = "myProcess";
ProcessInstance pi = runtimeService.createProcessInstanceQuery()
.processDefinitionKey(processDefinitionKey)
.singleResult();
System.out.println("流程實例ID:"+pi.getId());
System.out.println("流程定義ID:"+pi.getProcessDefinitionId());
}
流程實例的刪除
/**流程實例的刪除*/
@Test
public void deleteProcessInstanceTest(){
String processDefinitionKey = "myProcess";
ProcessInstance pi = runtimeService.createProcessInstanceQuery()
.processDefinitionKey(processDefinitionKey)
.singleResult();
String processInstanceId = pi.getProcessInstanceId();
System.out.println("流程實例ID:"+pi.getId());
runtimeService.deleteProcessInstance(processInstanceId,"刪除測試");
}