【Activiti工作流】8.流程例項,任務,執行物件控制流程的執行
阿新 • • 發佈:2019-01-03
我們之前講過了流程的定義,啟動,檢視和刪除,以及升級版本,接下來當流程
正式啟動成功之後,我們就要學習流程例項/任務的執行了。
1,流程例項/任務的執行
(1)啟動流程例項
(這裡前提是大家部署好了流程)
此時資料庫中act_ru_execution表中產生一條新的資料:
act_ru_execution表是正在執行的執行物件表。
其中ID_是執行物件ID,PROC_INST_ID是流程例項ID。
結論:如果是單例流程(沒有分支和聚合),那麼流程例項ID
和執行物件ID是相同的。
有正在執行的,就有之前的歷史,之前流程執行的歷史,
我們在act_hi_procinst表中檢視歷史資料:
可以看到,我們之前有一個走完的流程的資訊在歷史表中儲存,
那是我們Version為1的HelloWorld流程,第二個就是我們現在剛剛
建立的流程,可以看到開始時間和開始節點資訊,由於流程沒有結束,
所以還沒有儲存流程結束時間和流程結束節點的資訊。
結論:一個流程例項只有一個,但是執行物件可以存在多個。
(存在於不是單例流程,而包含分支和聚合的流程)
2.任務資訊
例如張三開始申請請假,那麼張三填寫完請假申請,點選提交之後,
目前此時張三就有一個待辦事項,就是張三向上一級提交請假資訊。
此時我們資料庫中act_ru_task表中就有該資料:
辦過的流程事務是有歷史資訊的,歷史表為act_hi_taskinst:
還有一張表act_hi_actinst,是存放所有活動節點的歷史表,包括任務和節點資訊:
3.查詢個人當前任務
通過上面的講解,我們可以明白之前我們查詢個人待辦事項的程式碼:
我們的流程啟動之後,第一個要辦理的業務就是提交申請業務,此時的辦理人就是
張三,所以通過張三去查詢待辦事項的時候,查詢到的就是提交申請的任務資訊。
然後我們分別執行完成任務的程式碼:
此時流程走到了部門經理李四那裡:
執行上面的findMyPersonalTask()方法,將assignee換為李四,此時查詢到:
跟資料庫中的資訊一樣。
此時我們的流程歷史資訊走了三步:
接下來執行李四的任務
任務此時到總經理王五那裡:
執行上面的findMyPersonalTask()方法,將assignee換為王五,此時查詢到:
跟資料庫中的資訊一樣。
接下來執行王五的任務:
此時流程走完,任務表中已經沒有了資訊:
檢視流程資訊表,也有了結束的時間:
檢視任務歷史表,可以看到三個任務的辦理歷史資訊:
我們的流程歷史表中,也存入了所有流程資訊:
總結:
流程例項,執行物件,任務:
act_ru_execution 正在執行的執行物件表
act_hi_procinst 流程例項的歷史表
act_tu_task 正在執行的任務表(只有節點是UserTask的時候,該表粗存在資料)
act_hi_taskinst 任務歷史表(只有節點是UserTask的時候,該表存在資料)
正式啟動成功之後,我們就要學習流程例項/任務的執行了。
1,流程例項/任務的執行
(1)啟動流程例項
(這裡前提是大家部署好了流程)
我們執行一下,結果:/** * 啟動流程 * 當流程到達一個節點時,會在act_ru_execution表中產生1條資料 * 如果當節點是使用者任務節點,這時會在act_ru_task表中產生1條資料 * */ @Test public void startProcess() throws Exception{ //按照流程定義的id啟動:Helloworld:1:4 (只啟動此版本流程,最高版本是HelloWorld:2:704) //runtimeService.startProcessInstanceById(processDefinitionId); //使用流程定義的key啟動流程,預設會啟動最高版本的流程 String processDefinitionkey="HelloWorld";//流程定義的key就是HelloWorld RuntimeService runtimeService=processEngine.getRuntimeService(); //獲取流程例項物件 ProcessInstance processInstance=runtimeService.startProcessInstanceByKey(processDefinitionkey); System.out.println("pid:"+processInstance.getId()); System.out.println("activitiId::"+processInstance.getActivityId()); System.out.println("pdid:"+processInstance.getProcessDefinitionId()); }
此時資料庫中act_ru_execution表中產生一條新的資料:
act_ru_execution表是正在執行的執行物件表。
其中ID_是執行物件ID,PROC_INST_ID是流程例項ID。
結論:如果是單例流程(沒有分支和聚合),那麼流程例項ID
和執行物件ID是相同的。
有正在執行的,就有之前的歷史,之前流程執行的歷史,
我們在act_hi_procinst表中檢視歷史資料:
可以看到,我們之前有一個走完的流程的資訊在歷史表中儲存,
那是我們Version為1的HelloWorld流程,第二個就是我們現在剛剛
建立的流程,可以看到開始時間和開始節點資訊,由於流程沒有結束,
所以還沒有儲存流程結束時間和流程結束節點的資訊。
結論:一個流程例項只有一個,但是執行物件可以存在多個。
(存在於不是單例流程,而包含分支和聚合的流程)
2.任務資訊
例如張三開始申請請假,那麼張三填寫完請假申請,點選提交之後,
目前此時張三就有一個待辦事項,就是張三向上一級提交請假資訊。
此時我們資料庫中act_ru_task表中就有該資料:
辦過的流程事務是有歷史資訊的,歷史表為act_hi_taskinst:
還有一張表act_hi_actinst,是存放所有活動節點的歷史表,包括任務和節點資訊:
3.查詢個人當前任務
通過上面的講解,我們可以明白之前我們查詢個人待辦事項的程式碼:
執行結果:/**查詢當前的個人任務(實際就是查詢act_ru_task表)*/ @Test public void findMyPersonalTask(){ String assignee="張三"; //獲取事務Service TaskService taskService=processEngine.getTaskService(); List<Task> taskList=taskService.createTaskQuery()//建立任務查詢物件 .taskAssignee(assignee)//指定個人任務查詢,指定辦理人 .list();//獲取該辦理人下的事務列表 if(taskList!=null&&taskList.size()>0){ for(Task task:taskList){ System.out.println("任務ID:"+task.getId()); System.out.println("任務名稱:"+task.getName()); System.out.println("任務的建立時間:"+task.getCreateTime()); System.out.println("任務辦理人:"+task.getAssignee()); System.out.println("流程例項ID:"+task.getProcessInstanceId()); System.out.println("執行物件ID:"+task.getExecutionId()); System.out.println("流程定義ID:"+task.getProcessDefinitionId()); System.out.println("#############################################"); } } }
我們的流程啟動之後,第一個要辦理的業務就是提交申請業務,此時的辦理人就是
張三,所以通過張三去查詢待辦事項的時候,查詢到的就是提交申請的任務資訊。
然後我們分別執行完成任務的程式碼:
/**完成我的任務*/
@Test
public void completeMyPersonalTask(){
String taskId="804";//上一次我們查詢的任務ID就是804
TaskService taskService=processEngine.getTaskService();
taskService.complete(taskId);//完成taskId對應的任務
System.out.println("完成ID為"+taskId+"的任務");
}
執行完804的任務,就完成了張三的任務此時流程走到了部門經理李四那裡:
執行上面的findMyPersonalTask()方法,將assignee換為李四,此時查詢到:
跟資料庫中的資訊一樣。
此時我們的流程歷史資訊走了三步:
接下來執行李四的任務
任務此時到總經理王五那裡:
執行上面的findMyPersonalTask()方法,將assignee換為王五,此時查詢到:
跟資料庫中的資訊一樣。
接下來執行王五的任務:
此時流程走完,任務表中已經沒有了資訊:
檢視流程資訊表,也有了結束的時間:
檢視任務歷史表,可以看到三個任務的辦理歷史資訊:
我們的流程歷史表中,也存入了所有流程資訊:
總結:
流程例項,執行物件,任務:
act_ru_execution 正在執行的執行物件表
act_hi_procinst 流程例項的歷史表
act_tu_task 正在執行的任務表(只有節點是UserTask的時候,該表粗存在資料)
act_hi_taskinst 任務歷史表(只有節點是UserTask的時候,該表存在資料)
act_hiactinst 所有活動節點的歷史表