activiti入门2流程引擎API和服务基础设施
RepositoryService :?管理和控制公布包和流程定義(包括了一個流程每一個環節的結構和行為)的操作
除此之外,服務能夠
-
查詢引擎中的公布包和流程定義。
-
暫停或激活公布包。相應所有和特定流程定義。 暫停意味著它們不能再運行不論什么操作了。激活是相應的反向操作。
-
獲得多種資源,像是包括在公布包里的文件。 或引擎自己主動生成的流程圖。
-
獲得流程定義的pojo版本號。 能夠用來通過java解析流程。而不必通過xml。
TaskService :全部與任務有關的功能
-
查詢分配給用戶或組的任務
-
創建獨立執行任務。這些任務與流程實例無關。
-
手工設置任務的運行者,或者這些用戶通過何種方式與任務關聯。
-
認領并完畢一個任務。認領意味著一個人期望成為任務的運行者。 即這個用戶會完畢這個任務。
完畢意味著“做這個任務要求的事情”。 通常來說會有非常多種處理形式。
IdentityService:?管理(創建,更新,刪除,查詢...)群組和用戶
?FormService:?一個可選服務,這個服務提供了啟動表單和任務表單兩個概念
?HistoryService:?提供了Activiti引擎的全部歷史數據
ManagementService :在使用Activiti的定制環境中基本上不會用到。 它能夠查詢數據庫的表和表的元數據。另外,它提供了查詢和管理異步操作的功能。?
獲取方式:
//通過activiti.cfg.xml獲取流程引擎ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); RepositoryService repositoryService = processEngine.getRepositoryService();不論什么與“靜態”資源有關的數據(比方流程定義)都能夠通過?RepositoryService訪問。
從概念上講,所以靜態數據都是Activiti的資源內容。
部署流程文件:
/*** 公布流程* 公布流程后。流程文件會保存到數據庫中*/@Testpublic void deployFlow(){RepositoryService repositoryService = processEngine.getRepositoryService();//獲取在classpath下的流程文件InputStream in = this.getClass().getClassLoader().getResourceAsStream("myleave.zip");ZipInputStream zipInputStream = new ZipInputStream(in);//使用deploy方法公布流程repositoryService.createDeployment()//通過ZIP方式來部署流程文件.addZipInputStream(zipInputStream)//通過輸入流來部署流程文件//.addInputStream("xx.bpmn",inputStream)//.addInputStream("xx.png", inputStream).name("Myleave")//設置流程定義的別名.deploy();//部署}當文件部署成功后,會操作數據庫中的這三張表
act_re_deployment ?(部署信息表)?
存放流程定義的別名和部署時間
act_re_procdef(流程定義數據表)
存放流程定義的信息。每部署一個新的流程定義都會在這張表中添加一條記錄。
假設當KEY同樣 也就是 bpmn流程文件的 ID 同樣是 ?添加的記錄里面的版本號會升級一個版本號
act_ge_bytearray(資源文件表)
存放部署后的流程文件查看流程定義信息:
/*** 查看流程定義* 查詢act_re_procdef表 流程定義表*/@Testpublic void queryProcdef(){RepositoryService repositoryService = processEngine.getRepositoryService();//創建查詢對象ProcessDefinitionQuery query = repositoryService.createProcessDefinitionQuery();//加入查詢條件query.processDefinitionKey("myProcess");//通過key獲取// .processDefinitionName("My process")//通過name獲取// .orderByProcessDefinitionId()//依據ID排序//.processDefinitionKeyLike(processDefinitionKeyLike)//支持模糊查詢//.listPage(firstResult, maxResults)//分頁//運行查詢獲取流程定義明細List<ProcessDefinition> pds = query.list();//獲取批量的明細//.singleResult()//獲取單個的明細for (ProcessDefinition pd : pds) {System.out.println("ID:"+pd.getId()+",NAME:"+pd.getName()+",KEY:"+pd.getKey()+",VERSION:"+pd.getVersion()+",RESOURCE_NAME:"+pd.getResourceName()+",DGRM_RESOURCE_NAME:"+pd.getDiagramResourceName());System.out.println("------------------------------------------------");}}執行結果:
ID:myProcess:1:604,NAME:My process,KEY:myProcess,DEPLOYMENT_ID:601,VERSION:1,RESOURCE_NAME:MyLeave.bpmn,DGRM_RESOURCE_NAME:MyLeave.png ------------------------------------------------ ID:myProcess:2:809,NAME:My process,KEY:myProcess,DEPLOYMENT_ID:806,VERSION:2,RESOURCE_NAME:MyLeave.bpmn,DGRM_RESOURCE_NAME:MyLeave.png ------------------------------------------------顯示圖片:
通過repositoryService查看流程定義信息,而且獲取DEPLOYMENT_ID到?act_ge_bytearray?查詢到 資源文件名稱
通過資源文件名稱和deploymentId獲取流并輸出到文件里
/*** 顯示圖片信息* @throws IOException*/@Testpublic void showImg() throws IOException{String deploymentId = "601";//通過deploymentId獲取資源名稱List<String> names = processEngine.getRepositoryService().getDeploymentResourceNames(deploymentId);String imgName = null;for (String name : names) {System.out.println("name:"+name);if (name.endsWith(".png")) {imgName = name;}}System.out.println("imgName:"+imgName);if (imgName != null) {File file = new File("e:/"+imgName);//獲取資源文件的流InputStream in = processEngine.getRepositoryService().getResourceAsStream(deploymentId, imgName);//通過FileUtils將資源文件以流的信息輸出到指定文件FileUtils.copyInputStreamToFile(in, file);}}在E盤下查看 生成的照片
刪除流程定義:
/*** 刪除流程定義*/@Testpublic void delDeployment(){String deploymentId = "1";processEngine.getRepositoryService()//普通刪除,刪除沒有在運行的流程,假設流程正在運行,則拋出異常//.deleteDeployment(deploymentId);//級聯刪除,無論你在不在運行,會刪除當前關聯的全部信息,包含在歷史表里的數據.deleteDeployment(deploymentId, true);}RuntimeService
獲取方式:
//通過activiti.cfg.xml獲取流程引擎ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();RuntimeService runtimeService = processEngine.getRuntimeService();啟動一個流程實例: /*** 啟動流程實例*/@Testpublic void startFlow(){RuntimeService runtimeService = processEngine.getRuntimeService();//通過Id來啟動一個流程并返回一個流程實例ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcess");System.out.println("id:"+processInstance.getId()+",activitiId:"+processInstance.getActivityId());}當一個流程實例啟動后,會在?act_ru_execution?表中插入一條記錄,假設是用戶任務節點,同一時候也會在act_ru_task表中插入一條記錄
查詢流程狀態:
/*** 查看流程狀態*/@Testpublic void queryState(){String processInstanceId = "701";ProcessInstance pi = processEngine.getRuntimeService()//創建運行對象查詢,查詢正在運行的運行對象//.createExecutionQuery().createProcessInstanceQuery()//創建流程實例查詢,查詢正在運行的流程實例.processInstanceId(processInstanceId)//通過流程實例ID查詢//返回批量結果//.list().singleResult();//返回唯一的結果if (pi != null) {System.out.println("當前流程:"+pi.getActivityId());}else {System.out.println("流程已經結束");}}在整個流程運行的過程中,流程ID 都是 唯一不變的,當流程結束后 流程記錄就會在?act_ru_execution?表中被刪除,存入到歷史表設置和獲取流程變量:
/*** 通過runtimeService設置流程變量* 設置流程變量*/public void setAndGetVariables(){RuntimeService runtimeService = processEngine.getRuntimeService();//通過運行對象ID和key value設置變量//value是一個object對象,當一個pojo類實現Serializable接口的時候就能夠存入流程變量中//runtimeService.setVariable(executionId, key, value);//設置專屬于一個運行對象ID的流程變量//runtimeService.setVariableLocal(executionId, key, value);//通過運行對象ID和Map設置多個變量Map<String, Object> paramMap = new HashMap<String, Object>();//runtimeService.setVariables(executionId, paramMap);//設置專屬于一個運行對象ID的多個流程變量//runtimeService.setVariablesLocal(executionId, paramMap);//通過運行對象ID獲取變量,返回object,須要強轉//runtimeService.getVariable(executionId, key);//通過運行對象ID獲取一個Map<String, Object>對象//runtimeService.getVariables(executionId);}流程變量所支持的類型
設置的流程變量會存入到act_ru_variable表
act_ru_variable表? 的BYTEARRAY_ID_相應的是?act_ge_bytearray 假設是復雜類型的數據 ?會存入二進制字段中
TaskService
獲取方式:
//通過activiti.cfg.xml獲取流程引擎ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();//獲取任務服務對象TaskService taskService = processEngine.getTaskService();查看個人任務: /*** 查看任務*/@Testpublic void queryTask(){//獲取任務服務對象TaskService taskService = processEngine.getTaskService();//依據接受人查詢該用戶的任務List<Task> tasks = taskService.createTaskQuery()//模糊查詢//.taskAssigneeLike(assigneeLike)//通過運行對象ID查詢任務//.executionId(executionId).taskAssignee("張三")//通過接受人來查詢個人任務.list();for (Task task : tasks) {System.out.println("ID:"+task.getId()+",姓名:"+task.getName()+",接收人:"+task.getAssignee()+",開始時間:"+task.getCreateTime());}}執行結果
ID:704,姓名:員工請假,接收人:張三,開始時間:Wed Oct 22 17:03:04 CST 2014 ID:804,姓名:員工請假,接收人:張三,開始時間:Thu Oct 23 11:27:47 CST 2014除了個人任務 還有 組任務
taskService 和 runtimeService 一樣都是能夠設置流程變量的
HistoryService
獲取方式:
查詢歷史任務: /*** 查詢歷史任務*/@Testpublic void queryHistoryTask(){String assignee = "張三";HistoryService historyService = processEngine.getHistoryService();List<HistoricTaskInstance> htis = historyService.createHistoricTaskInstanceQuery()//創建歷史任務查詢<span style="font-family: Arial, Helvetica, sans-serif;">對象</span>//創建一個歷史具體信息查詢<span style="font-family: Arial, Helvetica, sans-serif;">對象</span>//.createHistoricDetailQuery()//創建歷史流程實例查詢對象//.createHistoricProcessInstanceQuery().taskAssignee(assignee)//依據接受人查詢歷史任務.list();//返回批量結果for (HistoricTaskInstance hti : htis) {System.out.println("ID:"+hti.getId()+",流程實例ID:"+hti.getProcessInstanceId()+",接收人:"+hti.getAssignee()+",運行對象ID:"+hti.getExecutionId());System.out.println("------------------------------------------------");}}結果: ID:704,流程實例ID:701,接收人:張三,運行對象ID:701 ------------------------------------------------ ID:804,流程實例ID:801,接收人:張三,運行對象ID:801 ------------------------------------------------
查詢歷史流程實例:
主要是查詢act_hi_procinst表中的數據
主要是查詢act_hi_varinst表中的數據
查詢歷史活動信息: /*** 查詢歷史活動信息* 主要查詢的是act_hi_actinst表中的數據*/@Testpublic void queryHistoryAi(){String pi = "701";HistoryService historyService = processEngine.getHistoryService();List<HistoricActivityInstance> hais = historyService.createHistoricActivityInstanceQuery()//創建歷史活動實例查詢對象.processInstanceId(pi).list();for (HistoricActivityInstance hai : hais) {System.out.println("活動ID:"+hai.getActivityId()+",活動名稱:"+hai.getActivityName()+",活動類型:"+hai.getActivityType()+",流程實例ID:"+hai.getProcessInstanceId()+",接收人:"+hai.getAssignee());System.out.println("--------------------------------");}}結果: 活動ID:endevent1,活動名稱:End,活動類型:endEvent,流程實例ID:701,接收人:null -------------------------------- 活動ID:startevent1,活動名稱:Start,活動類型:startEvent,流程實例ID:701,接收人:null -------------------------------- 活動ID:員工請假,活動名稱:員工請假,活動類型:userTask,流程實例ID:701,接收人:張三 -------------------------------- 活動ID:老板審批,活動名稱:老板審批,活動類型:userTask,流程實例ID:701,接收人:老板 --------------------------------
這幾個是最經常使用的幾個服務.
流程實例和運行對象的差別 ? 流程實例和運行對象 2個是不同的一個概念
版權聲明:本文博主原創文章。博客地址:http://blog.csdn.net/a67474506?
viewmode=contents
轉載于:https://www.cnblogs.com/zfyouxi/p/4797460.html
總結
以上是生活随笔為你收集整理的activiti入门2流程引擎API和服务基础设施的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在Ubutun 14.04 Deskto
- 下一篇: SGU 183. Painting th