Activity流程框架

主要的六個概念:
流程定義 流程實例 流程變量 任務 起始結束 網關

ProcessEngine 線程安全 是Activiti5的核心,所有的服務都需要通過ProcessEngine來創建
Activiti5的持久化層採用的是Mybatis

通過ProcessEngine創建的7個service:
repositoryService(持久化服務) 與數據庫進行交互的
runtimeService(運行時服務) 與運行流程有關
formService(表單服務)
identityService(身份信息)
taskService(任務服務) 與流程中的每一個步驟有關
historyService(歷史信息) 查看歷史的流程步驟
managementService(管理定時任務)在固定的時間點完成固定的任務

**

表結構

**

act_ge_bytearray二進制數據表
act_ge_property屬性數據表存儲整個流程引擎級別的數據,初始化表結構時,會默認插入三條記錄,
 
act_hi_actinst歷史節點表  ****
act_hi_attachment歷史附件表
act_hi_comment歷史意見表
act_hi_identitylink歷史流程人員表
act_hi_detail歷史詳情表,提供歷史變量的查詢
act_hi_procinst歷史流程實例表****
act_hi_taskinst歷史任務實例表****
act_hi_varinst歷史變量表
 
act_id_group用戶組信息表
act_id_info用戶擴展信息表
act_id_membership用戶與用戶組對應信息表
act_id_user用戶信息表
 
act_re_deployment部署信息表
act_re_model流程設計模型部署表
act_re_procdef流程定義數據表
 
act_ru_event_subscr  throwEvent、catchEvent時間監聽信息表
act_ru_execution運行時流程執行實例表****
act_ru_identitylink運行時流程人員表,主要存儲任務節點與參與者的相關信息
act_ru_job運行時定時任務數據表
act_ru_task運行時任務節點表
act_ru_variable運行時流程變量數據表
act_ge_bytearray二進制數據表
act_ge_property屬性數據表存儲整個流程引擎級別的數據,初始化表結構時,會默認插入三條記錄,
 
act_hi_actinst歷史節點表
act_hi_attachment歷史附件表
act_hi_comment歷史意見表
act_hi_identitylink歷史流程人員表
act_hi_detail歷史詳情表,提供歷史變量的查詢
act_hi_procinst歷史流程實例表
act_hi_taskinst歷史任務實例表
act_hi_varinst歷史變量表
 
act_id_group用戶組信息表
act_id_info用戶擴展信息表
act_id_membership用戶與用戶組對應信息表
act_id_user用戶信息表
 
act_re_deployment部署信息表
act_re_model流程設計模型部署表
act_re_procdef流程定義數據表
 
act_ru_event_subscr  throwEvent、catchEvent時間監聽信息表
act_ru_execution運行時流程執行實例表
act_ru_identitylink運行時流程人員表,主要存儲任務節點與參與者的相關信息
act_ru_job運行時定時任務數據表
act_ru_task運行時任務節點表****
act_ru_variable運行時流程變量數據表

**

基本使用

配置好後 可以直接注入對象使用
**

(1)部署: 在process文件夾下放bpmn文件
Deployment deploy = repositoryService.createDeployment().addClasspathResource("文件.bpmn").deploy();  
		部署後:
		1act_ge_bytearray表
		二進制數據表,存儲了流程定義圖形的XML文件和圖片信息
		保存流程定義的xml信息 
		保存流程定義的圖片  
		2.act_re_deployment
		部署信息表,存儲了部署的相關信息(部署時間)
		3.act_re_procdef
		流程定義數據表,存儲了當前流程圖形的相關信息(id,name,版本號)

		如果有亂碼:
		@Configuration
		public class ActivitiConfig implements ProcessEngineConfigurationConfigurer{
		@Override
		public void configure(SpringProcessEngineConfiguration processEngineConfiguration) {
		processEngineConfiguration.setActivityFontName("宋體");
		processEngineConfiguration.setLabelFontName("宋體");
		} 
		}
	
		查詢流程部署數據:
			ProcessDefinitionQuery query = repositoryService.createProcessDefinitionQuery();
		/*List<ProcessDefinition> list = query.list();
		for (ProcessDefinition pd : list) {
		System.out.println(pd.getId() +" - " + pd.getName() + " - " + pd.getVersion());
		}*/
		long count = query.count(); //流程定義的數量

		//ProcessDefinition singleResult = query.latestVersion().singleResult();//獲取最後一次部署的流程定義對象
		//System.out.println(singleResult.getId() +" - " + singleResult.getName() + " - " + singleResult.getVersion());
		
		/*ProcessDefinitionQuery processDefinitionQuery = query.orderByProcessDefinitionVersion().desc();//根據版本號進行倒序排序
		List<ProcessDefinition> list2 = processDefinitionQuery.list();
		for (ProcessDefinition pd : list2) {
		System.out.println("---"+pd.getId() +" - " + pd.getName() + " - " + pd.getVersion());
		}*/
		 
		//query.listPage(firstResult, maxResults);//分頁的方法
		ProcessDefinition singleResult = query.processDefinitionKey("myProcess").latestVersion().singleResult();
		System.out.println(singleResult.getId() +" - " + singleResult.getName() + " - " + singleResult.getVersion());
(2)啓動流程實例:
		//查詢流程定義
		ProcessDefinition processDefinition = repositoryService
		.createProcessDefinitionQuery()
		.processDefinitionKey("你的key")
		.latestVersion()
		.singleResult();
		 
		//運行啓動流程實例
		
		ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinition.getId());
 		//可以進行輸出
		相關表哥:
		act_ru_execution : 運行時流程執行實例表 
		act_ru_task : 運行時任務節點表 
		act_hi_procinst : 歷史流程實例表 
		act_hi_taskinst : 歷史任務實例表 
		act_hi_actinst : 歷史節點列表,把每一個執行過的節點數據保存 

(3)獲取流程任務
			TaskQuery taskQuery = taskService.createTaskQuery();
			List<Task> list1 = taskQuery.taskAssignee("名字").list();  
			List<Task> list2 = taskQuery.taskAssignee("名字").list(); 
			 
			for (Task task : list1) {
				System.out.println("1的任務="+task.getName());
			}
		 
			for (Task task : list2) {
				System.out.println("2的任務="+task.getName());
			} 

(4)查詢並完成任務:
		TaskQuery taskQuery = taskService.createTaskQuery();
		List<Task> list1 = taskQuery.taskAssignee("1").list(); 
		List<Task> list2 = taskQuery.taskAssignee("2").list();
		for (Task task : list1) {
			System.out.println("1的任務="+task.getName());
			taskService.complete(task.getId());
		}
(5)歷史任務:
		//查詢流程定義
		ProcessDefinition processDefinition = repositoryService
		.createProcessDefinitionQuery()
		.processDefinitionKey("你的key")
		.latestVersion()
		.singleResult();
		 
		HistoricProcessInstanceQuery query = historyService.createHistoricProcessInstanceQuery();
		HistoricProcessInstance historicProcessInstance =
	 query.processInstanceId("401").finished().singleResult();
		//HistoricProcessInstanceEntity[superProcessInstanceId=null]
	 	//finished() 判斷流程實例是否完成狀態,如果是完成狀態會返回歷史流程實例對象,否則爲null
(6)對任務進行領取:
		TaskQuery taskQuery = taskService.createTaskQuery();
		List<Task> list = taskQuery.taskCandidateGroup("組名字").list();
 		for (Task task : list) {
			taskService.claim(task.getId(), "人"); //領取任務                        
		}
(7)採用流程變量獲取委託人:
		ProcessDefinition processDefinition = repositoryService
		.createProcessDefinitionQuery()
		.processDefinitionKey("key")
		.latestVersion()
		.singleResult();
		 
		Map<String,Object> variables = new HashMap<String,Object>();
		variables.put("設置好的流程變量1", "人1");
		variables.put("設置好的流程變量2", "人2");
		 
		//ProcessInstance processInstance =
	 runtimeService.startProcessInstanceById(processDefinition.getId());
		ProcessInstance processInstance =
	 runtimeService.startProcessInstanceById(processDefinition.getId(),variables);
		System.out.println(processInstance);
(8)排他網關: 多個分支只能有一個被執行 
		Deployment deploy =
	 repositoryService.createDeployment().addClasspathResource("你的文件.bpmn").deploy();
		System.out.println(deploy);
		 
		//查詢流程定義
		ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
		.processDefinitionKey("key")
		.latestVersion()
		.singleResult();
		 
		//準備流程變量
		Map<String,Object> variables = new HashMap<String,Object>();
		variables.put("days", 3);
		 
		//啓動流程,傳遞流程變量
		ProcessInstance processInstance =
	 runtimeService.startProcessInstanceById(processDefinition.getId(),variables);
		 
		List<Task> list = taskService.createTaskQuery().taskAssignee("任命").list();
		for (Task task : list) {
			taskService.complete(task.getId());
		}
		 
		HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery()
		.processInstanceId(processInstance.getId())
		.finished()
		.singleResult();

並行網關:多個分支同時都被執行,流程才能往後執行 ,稱爲並行網關  
		Deployment deploy =
		 repositoryService.createDeployment().addClasspathResource("文件.bpmn").deploy();
		 
		//查詢流程定義
		ProcessDefinition processDefinition = repositoryService
		.createProcessDefinitionQuery()
		.processDefinitionKey("key")
		.latestVersion()
		.singleResult();
		 
		//啓動流程,傳遞流程變量
		ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinition.getId());

		 
		List<Task> list1 = taskService().createTaskQuery().taskAssignee("人1").list();
		List<Task> list2 = taskService().createTaskQuery().taskAssignee("人2").list();
		 
		 
		for (Task task : list1) {
	
		taskService().complete(task.getId());
		}
		 

		 
		HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery()
		.processInstanceId(processInstance.getId())
		.finished()
		.singleResult();
		 
		 
		 
		for (Task task : list2) {
	
		processEngine.getTaskService().complete(task.getId());
		}
		 

		 
		historicProcessInstance = historyService()
		.createHistoricProcessInstanceQuery()
		.processInstanceId(processInstance.getId())
		.finished()
		.singleResult();

包含網關 :相當於 排他 加 並行網關
			如果當前條件只有一個成立則執行後續流程-相當於排他網關
			如果當前所有條件成立,則必須所有條件成立的任務完成纔會執行後續流程-相當於並行網關
		
		Deployment deploy = repositoryService.createDeployment().addClasspathResource("文件.bpmn").deploy();
		 
		//查詢流程定義
		ProcessDefinition processDefinition = repositoryService
		.createProcessDefinitionQuery()
		.processDefinitionKey("key")
		.latestVersion()
		.singleResult();
		 
		//準備流程變量
		Map<String,Object> variables = new HashMap<String,Object>();
		//variables.put("days", 5);//條件:days>3
		//variables.put("cost", 100); //條件:cost>5000
		 
		variables.put("days", 5);//條件:days>3
		variables.put("cost", 10000); //條件:cost>5000
		 
		//啓動流程,傳遞流程變量
		ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinition.getId(),variables);
		List<Task> list = taskService.createTaskQuery().taskAssignee("人1").list();
		for (Task task : list) {
		taskService.complete(task.getId());
		}
		 
		HistoricProcessInstance historicProcessInstance =historyService.createHistoricProcessInstanceQuery()
		.processInstanceId(processInstance.getId())
		.finished()
		.singleResult();
(9)流程監聽器:
		寫兩個類實現 ExecutionListener
		選擇結束節點 加監聽器
			//部署流程
		ProcessInstance pi = processEngine.getRuntimeService().startProcessInstanceByKey("key");
		 
		TaskService taskService = processEngine.getTaskService();
		 
		List<Task> tasks = taskService.createTaskQuery().taskAssignee("人1").list();
		 
		for ( Task task : tasks ) {
			taskService.setVariable(task.getId(), "flg", false);
			taskService.complete(task.getId());
		}
	、、

發佈了66 篇原創文章 · 獲贊 44 · 訪問量 7317
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章