工做流從流程定義到建立一個流程實例完成執行步驟
上面就是一個最簡單從上往下執行的流程的執行步驟,本章節都是以代碼作示例,代碼很少,可是都執行一遍,你會對整個activiti的流程有個大概的瞭解web
1,首先第一步要作的就是經過eclipse插件activiti-designer繪製一張最簡單的流程圖出來(在這裏咱們只用到了startEvent,endEvent,UserTask三個組件因此是比較簡單的)數據庫
繪製的流程圖以下api
當咱們點擊建立採購單的時候,爲這個節點定義一個id和名稱(下面幾個節點也是一樣的道理)eclipse
點擊左側的mainConfig在Assingee輸入一個名字,設置該流程這個步驟的處理人(固然在實際程序中會採用另外的動態獲取的方式,這樣只是方便理解一個總體過程)this
接下來一樣的道理依次爲每一個節點設置處理人spa
最後點擊空白處,設置整個流程的id和名稱插件
到這裏點擊保存後,會在相同的目錄下生成purchasingflow.png,到這裏簡單的流程就繪製完成了3d
2,利用activiti的api將上面定義好的工做流bpmn文件和png文件上傳到activiti的數據庫code
1 /* 2 * 獲取流程引擎對象,下面的方法會默認查找classpath目錄下的名稱爲activi.cfg.xml 3 * 裏面bean的id爲processEngineConfiguration的ProcessEngineConfiguration引擎配置對象來獲取ProcessEngine對象 4 */ 5 private ProcessEngine engine = ProcessEngines.getDefaultProcessEngine(); 6 7 //部署一個流程 8 @Test 9 public void deployProcessDefinition(){ 10 //根據引擎獲取資源service 11 RepositoryService repositoryService = engine.getRepositoryService(); 12 //部署bpmn文件 13 String bpmnName="purchasingflow.bpmn"; 14 InputStream bpmnIn = this.getClass().getClassLoader().getResourceAsStream("diagram/purchasingflow.bpmn"); 15 //部署bpmn生成的圖片 16 String pngName="purchasingflow.png"; 17 InputStream pngIn = this.getClass().getClassLoader().getResourceAsStream("diagram/purchasingflow.png"); 18 //添加這兩個文件進行部署 19 Deployment deployment = repositoryService.createDeployment() 20 .addInputStream(bpmnName, bpmnIn) 21 .addInputStream(pngName, pngIn) 22 .deploy(); 23 24 System.out.println("部署id:"+deployment.getId()); 25 System.out.println("部署的name:"+deployment.getDeploymentTime()); 26 27 }
上面的簡單的api就將採購流程的流程定義部署到咱們的activiti的數據庫,打開數據庫act_re_procdef能夠查詢到咱們剛纔上傳的流程定義orm
3,在啓動一個流程實例以前咱們再重複上傳上面的流程定義,接着咱們根據流程定義的id(purchasingflow)來查詢這個流程定義看看會發生什麼狀況
1 //查詢流程定義 2 @Test 3 public void queryProcessDefinition(){ 4 5 RepositoryService repositoryService = engine.getRepositoryService(); 6 //建立流程定義查詢對象 7 ProcessDefinitionQuery definitionQuery = repositoryService.createProcessDefinitionQuery(); 8 9 String processDefinitionKey = "purchasingflow"; 10 //設置流程定義的key的查詢條件 11 definitionQuery.processDefinitionKey(processDefinitionKey); 12 //查詢全部的流程定義 13 List<ProcessDefinition> processDefinitionList = definitionQuery.list(); 14 for(ProcessDefinition definition:processDefinitionList){ 15 System.out.println("-------------------------"); 16 System.out.println("流程定義id:"+definition.getId()); 17 System.out.println("流程資源名:"+definition.getResourceName()); 18 System.out.println("流程部署id:"+definition.getDeploymentId()); 19 } 20 21 22 }
上面的結果輸出了三條流程定義,而且部署的id不一樣和流程定義的id都不相同,帶着這個疑問,咱們在下面啓動一個流程實例並詳細講解下
4,啓動一個流程實例
1 //啓動一個流程實例 2 @Test 3 public void startProcessInstance(){ 4 5 RuntimeService runtimeService = engine.getRuntimeService(); 6 7 String processDefinitionKey = "purchasingflow"; 8 //根據流程定義的key啓動一個流程實例 9 ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey); 10 System.out.println("流程實例id:"+processInstance.getId()); 11 System.out.println("流程定義id:"+processInstance.getProcessDefinitionId()); 12 13 14 }
咱們發現上面打印的流程定義的id是咱們最後一次上傳的流程定義,因此咱們得出結論,屢次上傳相同id的流程定義,根據流程定義啓動流程實例,會取版本最新的流程定義
5,查詢當前處理人的任務,咱們以前在流程定義的時候寫死第一個節點(也就是建立採購單這一步的處理人是zhangsan)
1 //查詢當前用戶的代辦任務 2 @Test 3 public void queryProcessInstance(){ 4 5 //查詢任務使用的service 6 TaskService taskService = engine.getTaskService(); 7 //獲取任務查詢對象 8 TaskQuery taskQuery = taskService.createTaskQuery(); 9 taskQuery.taskAssignee("zhangsan"); 10 //查詢該條件下的全部的任務 11 List<Task> tasks =taskQuery.list(); 12 for(Task task:tasks){ 13 System.out.println("當前任務id:"+task.getId()); 14 System.out.println("當前任務所屬流程定義id:"+task.getProcessDefinitionId()); 15 System.out.println("當前任務的key:"+task.getTaskDefinitionKey()); 16 } 17 18 }
咱們經過zhangsan查詢到當前任務的id和所屬流程定義id,你們會發現若是填寫的不是zhangsan而是別的就會查詢不到,由於咱們指定的任務處理人是zhangsan
6,處理一個任務,到這裏咱們的zhangsan獲取到這個任務後,須要處理完它
1 //完成一個流程 2 @Test 3 public void completeProcessInstance(){ 4 5 //任務的id,後期整合後會經過當前登陸人身份查詢到該用戶的任務,而後獲取到該id 6 String taskId="402"; 7 TaskService taskService = engine.getTaskService(); 8 //根據任務id完成該任務 9 taskService.complete(taskId); 10 11 }
7,咱們在經過lisi,也就是下一節點的處理人查詢當前任務會發現查詢到了一個任務,而後重複5,6,直到任務結束