一、API介紹 流程引擎創建方式
Activiti 核心API 處理一個流程在部署啓動以及後面的一系列的操作都是圍繞着這幾個核心API來完成的。首先這幾個API中最重要的是ProcessEngine流程引擎,其他幾個API都是通過流程引擎來創建的。
創建processEngine流程引擎對象的方法也有很多,可以參照這篇點擊打開鏈接博客。這裏講的是更爲便捷的一種創建方式,直接使用構造類來創建。
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
我們可以通過讀取源碼,看這種方式的創建流程引擎的方式,其實也是通過讀取配置文件來創建,只是這裏已經幫我們完成了這不操作,不需要我再去Build,直接返回的就是流程引擎對象。ProcessEngines會掃描所有activiti.cfg.xml
和 activiti-context.xml
文件。 對於activiti.cfg.xml
文件,流程引擎會使用Activiti的經典方式構建:ProcessEngineConfiguration.createProcessEngineConfigurationFromInputStream(inputStream).buildProcessEngine()
. 對於activiti-context.xml
文件,流程引擎會使用Spring方法構建:先創建一個Spring的環境, 然後通過環境獲得流程引擎。
這裏看的已經很清楚了,創建完成流程引擎我們就可以來完成一下幾個核心API的創建。
RepositoryService | 管理流程定義 |
RuntimeService | 執行管理,包括啓動、推進、刪除流程實例等操作 |
TaskService | 任務管理 |
HistoryService | 歷史管理(執行完的數據的管理) |
IdentityService | 組織機構管理 |
FormService | 一個可選擇的服務 |
ManagerService | 管理服務 |
二、API詳解
其中使用最多的主要是前面的五種,下面通過每個API的使用例子來闡述其作用。
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RuntimeService runtimeService = processEngine.getRuntimeService();
RepositoryService repositoryService = processEngine.getRepositoryService();
TaskService taskService = processEngine.getTaskService();
ManagementService managementService = processEngine.getManagementService();
IdentityService identityService = processEngine.getIdentityService();
HistoryService historyService = processEngine.getHistoryService();
FormService formService = processEngine.getFormService();
2.1 RepositoryService
是Activiti的倉庫服務類。所謂的倉庫指流程定義文檔的兩個文件:bpmn文件和流程圖片。
1) 產生方式
processEngine.getRepositoryService()//流程定義和部署對象相關的service
2) 可以產生DeploymentBuilder,用來定義流程部署的相關參數
Deployment deployment= processEngine.getRepositoryService()//流程定義和部署對象相關的service
.createDeployment()//創建部署對象
.name("第一條流程")
3) 刪除流程定義
Deployment deployment= processEngine.getRepositoryService()//流程定義和部署對象相關的service
.deleteDeployment(deploymentId)//刪除部署對象
2.2 RuntimeService 流程服務類
ProcessInstance processInstance = processEngine.getRuntimeService()//與正在執行的流程實例和執行對象相關的service
.startProcessInstanceByKey("key");//使用流程定義Key啓動,key對應bpmn文件中的id,key啓動默認是最新版本的流程定義
2)查看流程是否結束
ProcessInstance processInstance = processEngine.getRuntimeService()//正在執行的流程
.createProcessInstanceQuery()//創建流程實例查詢對象
.processInstanceId("流程實例ID")
.singleResult();
//如果爲空,流程已結束
if(processInstance==null){
System.out.println("流程已結束");
}else{
System.out.println("流程未結束");
}
2.3 TaskService 任務服務類
List<Task> list = processEngine.getTaskService()//與正在執行任務相關的service
.createTaskQuery()//創建任務查詢對象
.taskAssignee("當前處理人")
.list();
2)完成任務
processEngine.getTaskService()//任務相關service
.complete("108");
System.out.println("---任務已完成---");
2.4 HistoryService 關於歷史數據查詢
1)查詢歷史流程實例
/**查詢歷史流程實例*/
@Test
public void findHistoryProcessInstance(){
String processInstanceId = "2101";
HistoricProcessInstance hpi = processEngine.getHistoryService()//與歷史數據(歷史表)相關的Service
.createHistoricProcessInstanceQuery()//創建歷史流程實例查詢
.processInstanceId(processInstanceId)//使用流程實例ID查詢
.orderByProcessInstanceStartTime().asc()
.singleResult();
2)查詢歷史活動
List<HistoricActivityInstance> list = processEngine.getHistoryService()//
.createHistoricActivityInstanceQuery()//創建歷史活動實例的查詢
.processInstanceId(processInstanceId)//
.orderByHistoricActivityInstanceStartTime().asc()//
.list();
3)查詢歷史任務
List<HistoricTaskInstance> list = processEngine.getHistoryService()//與歷史數據(歷史表)相關的Service
.createHistoricTaskInstanceQuery()//創建歷史任務實例查詢
.processInstanceId(processInstanceId)//
.orderByHistoricTaskInstanceStartTime().asc()
.list();
4)查詢歷史流程變量
List<HistoricVariableInstance> list = processEngine.getHistoryService()//
.createHistoricVariableInstanceQuery()//創建一個歷史的流程變量查詢對象
.processInstanceId(processInstanceId)//
.list();
2.5 IdentityService 關於組織機構的查詢
就是組織管理系,這裏面很少用Activiti,因爲提供的字段太少,一般的項目中會自己維護一套組織機構的關係表。
/**在部署流程定義和啓動流程實例的中間,設置組任務的辦理人,向Activiti表中存放組和用戶的信息*/
IdentityService identityService = processEngine.getIdentityService();//認證:保存組和用戶信息
identityService.saveGroup(new GroupEntity("部門經理"));//建立組
identityService.saveGroup(new GroupEntity("總經理"));//建立組
identityService.saveUser(new UserEntity(“小張”));//建立用戶
identityService.saveUser(new UserEntity("小李")); //建立用戶
identityService.saveUser(new UserEntity("小王")); //建立用戶
identityService.createMembership("小張", "部門經理");//建立組和用戶關係
identityService.createMembership("小李", "部門經理");//建立組和用戶關係
identityService.createMembership(“小王”, “總經理”);//建立組和用戶關係
表結構介紹
act_id_group:角色組表
act_id_user:用戶表:
act_id_membership:用戶角色表
指定組任務的辦理人,查詢組任務
String userId =“小張”;//小張,小李可以查詢結果,小王不可以,因爲他不是部門經理角色
List<Task>list = processEngine.getTaskService()//
.createTaskQuery()//
.taskCandidateUser(userId)//指定組任務查詢
.list();
2.6 FormService 可選服務
2.7 ManagementService
在使用Activiti的定製環境中基本上不會用到。 它可以查詢數據庫的表和表的元數據。另外,它提供了查詢和管理異步操作的功能。 Activiti的異步操作用途很多,比如定時器,異步操作, 延遲暫停、激活,等等。
*注:文中詳細源碼例子,可以到github上下載:ActivitiDemo GitHub地址