工做流學習——Activiti流程實例、任務管理四步曲

 

工做流學習——Activiti流程實例、任務管理四步曲

標籤: 工做流activiti5java

2015-06-26 10:15 34242人閱讀 評論(6) 收藏 舉報mysql

 分類:sql

java學習(46) 數據庫

目錄(?)[+]app

1、前言

 

    上一篇文章中咱們將Activiti流程定義管理的知識進行了介紹,這篇文章咱們繼續Activiti流程實例和任務管理的學習。學習

 

2、正文

 

流程實例(ProcessInstance )

 

    流程實例(ProcessInstance)和上一篇文章中流程定義(ProcessDefinition)的關係,與類和實例對象的關係有點像,ProcessDefinition是整個流程步驟的說明而ProcessInstance就是指流程定義從開始到結束的那個最大的執行路線。 spa

 

執行對象(Execution)

 

    提到ProcessInstance同時又會出現另外一個名詞,那就是執行對象(Execution),Execution是按照ProcessDefinition的規則執行的當前的路線,.net

 

    若是ProcessDefinition只有一個執行路線的話,那麼Execution和ProcessInstance就是徹底同樣了若是ProcessDefinition中有多個執行路線的話,Execution和ProcessInstance多是同一個也可能不是同一個。因此得出結論:一個流程中ProcessInstance有且只能有一個,而Execution能夠存在多個。對象

 

任務(Task )

 

    任務(Task)應該比較好理解,就是當流程執行到某步驟或某環節時生產的任務信息。blog

 

    在上篇文章中咱們將如何畫流程圖、如何部署流程定義已經介紹,流程定義和流程實例的關係剛纔已經介紹了,全部如今咱們就該開始啓動流程實例了:

 

代碼

 

啓動流程實例

 

[java] view plain copy

  1. /** 
  2.  * 啓動流程實例 
  3.  */  
  4. @Test  
  5. public void startProcessInstance() {  
  6.     // 流程定義的key  
  7.     String processDefinitionKey = "HelloWorld";  
  8.     ProcessInstance pi = processEngine.getRuntimeService()// 與正在執行的流程實例和執行對象相關的Service  
  9.             .startProcessInstanceByKey(processDefinitionKey);// 使用流程定義的key啓動流程實例,key對應HelloWorld.bpmn文件中id的屬性值,使用key值啓動,默認是按照最新版本的流程定義啓動  
  10.     System.out.println("流程實例ID:" + pi.getId());  
  11.     System.out.println("流程定義ID:" + pi.getProcessDefinitionId());  
  12. }  


運行結果:

 

 

    流程實例ID:501

    流程定義ID:HelloWorld:2:404

 

說明:

 

    1)在數據庫的act_ru_execution正在執行的執行對象表中插入一條記錄

    2)在數據庫的act_hi_procinst程實例的歷史表中插入一條記錄

    3)在數據庫的act_hi_actinst活動節點的歷史表中插入一條記錄

    4)咱們圖中節點都是任務節點,因此同時也會在act_ru_task流程實例的歷史表添加一條記錄

    5)在數據庫的act_hi_taskinst任務歷史表中也插入一條記錄。

 

 

 

查詢歷史流程實例

    

    流程實例啓動之後,咱們也能夠對某個流程實例一共一共執行了多少次流程進行查詢,由於咱們本例中如今剛進行了一個流程,因此目前只能查出一個流程:

 

[java] view plain copy

  1. /** 
  2.  * 查詢歷史流程實例 
  3.  */  
  4. @Test  
  5. public void findHistoryProcessInstance(){  
  6.     String processInstanceId="501";  
  7.     HistoricProcessInstance hpi = processEngine.getHistoryService()  
  8.             .createHistoricProcessInstanceQuery()  
  9.             .processInstanceId(processInstanceId)  
  10.             .singleResult();  
  11.     System.out.println(hpi.getId() +"    "+hpi.getProcessDefinitionId()+"   "+ hpi.getStartTime()+"   "+hpi.getDurationInMillis());  
  12. }  


運行結果:

 

 

    501    HelloWorld:2:404   Fri Jun 26 09:34:51 CST 2015   null

 

 

 

 

查詢當前的我的任務

 

    在上面講流程啓動後,由於該節點是任務節點因此在任務表中插入了任務的記錄,如今咱們就經過辦理人將任務進行下查詢:

 

[java] view plain copy

  1. /** 
  2.  * 查詢當前的我的任務 
  3.  */  
  4. @Test  
  5. public void findMyPersonTask() {  
  6.     String assignee = "張三"; // TODO  
  7.     List<Task> list = processEngine.getTaskService()// 與正在執行的任務管理相關的service  
  8.             .createTaskQuery()// 建立任務查詢對象  
  9.             // 查詢條件  
  10.             .taskAssignee(assignee)// 指定我的任務查詢,指定辦理人  
  11.             // .taskCandidateGroup("")//組任務的辦理人查詢  
  12.             // .processDefinitionId("")//使用流程定義ID查詢  
  13.             // .processInstanceId("")//使用流程實例ID查詢  
  14.             // .executionId(executionId)//使用執行對象ID查詢  
  15.             /** 排序 */  
  16.             .orderByTaskCreateTime().asc()// 使用建立時間的升序排列  
  17.             // 返回結果集  
  18.             // .singleResult() //返回惟一的結果集  
  19.             // .count()//返回結果集的數量  
  20.             // .listPage(firstResult, maxResults)//分頁查詢  
  21.             .list();// 返回列表  
  22.     if (list != null && list.size() > 0) {  
  23.         for (Task task : list) {  
  24.             System.out.println("任務ID:" + task.getId());  
  25.             System.out.println("任務名稱:" + task.getName());  
  26.             System.out.println("任務的建立時間:" + task.getCreateTime());  
  27.             System.out.println("任務的辦理人:" + task.getAssignee());  
  28.             System.out.println("流程實例ID:" + task.getProcessInstanceId());  
  29.             System.out.println("執行對象ID:" + task.getExecutionId());  
  30.             System.out.println("流程定義ID:" + task.getProcessDefinitionId());  
  31.             System.out  
  32.                     .println("##################################################");  
  33.         }  


運行結果:

 

 

    任務ID:504

    任務名稱:提交申請

    任務的建立時間:Fri Jun 2609:34:51 CST 2015

    任務的辦理人:張三

    流程實例ID:501

    執行對象ID:501

    流程定義ID:HelloWorld:2:404

    ##################################################

 

說明:

 

    1)由於是任務查詢,因此從processEngine中應該獲得TaskService

    2)使用TaskService獲取到任務查詢對象TaskQuery

    3)爲查詢對象添加查詢過濾條件,使用taskAssignee指定任務的辦理者(即查詢指定用戶的代辦任務),同時能夠添加分頁排序等過濾條件

    4)調用list方法執行查詢,返回辦理者爲指定用戶的任務列表

    5)任務ID、名稱、辦理人、建立時間能夠從act_ru_task表中查到。

    6)在如今這種狀況下,ProcessInstance至關於Execution

    7) 一個Task節點和Execution節點是1對1的狀況,在task對象中使用Execution_來表示他們之間的關係

    8)任務ID在數據庫表act_ru_task中對應「ID_」列

 

 

完成任務

 

    查詢完任務後,咱們接下來將這個任務id爲504的任務進行完成:

 

[java] view plain copy

  1. /** 
  2.  * 完成個人任務 
  3.  */  
  4. @Test  
  5. public void compliteMyPersonTask() {  
  6.     // 任務ID  
  7.     String taskId = "504";  
  8.     processEngine.getTaskService().complete(taskId);  
  9.     ;  
  10.     System.out.println("完成任務:任務ID:" + taskId);  
  11. }  


運行結果:

 

 

    完成任務:任務ID:504

 

說明:

 

    1)是完成任務,因此從ProcessEngine獲得的是TaskService。

    2)當執行完這段代碼,再以員工的身份去執行查詢的時候,會發現這個時候已經沒有數據了,由於正在執行的任務中沒有數據。

    3)對於執行完的任務,activiti將從act_ru_task表中刪除該任務,下一個任務會被插入進來。

    4)以」部門經理」的身份進行查詢,能夠查到結果。由於流程執行到部門經理審批這個節點了。

    5)再執行辦理任務代碼,執行完之後以」部門經理」身份進行查詢,沒有結果。

    6)重複第3和4步直到流程執行完。

 

 

查詢歷史任務

 

    員工張三的任務已經完成,如今任務到部門經理李四了,若是咱們如今仍然查詢張三的任務的話,天然是查詢不到了,只有查詢李四才能夠查到,不過咱們能夠經過流程實例id查詢歷史任務,查詢歷史任務能夠將已經辦理過的任務和如今正在執行的任務都查詢出來:

 

[java] view plain copy

  1. /** 
  2.  * 查詢歷史任務 
  3.  */  
  4. @Test  
  5. public void findHistoryTask(){  
  6.     String processInstanceId="501";  
  7.     List<HistoricTaskInstance> list = processEngine.getHistoryService()//與歷史數據(歷史表)相關的service  
  8.             .createHistoricTaskInstanceQuery()//建立歷史任務實例查詢  
  9.             .processInstanceId(processInstanceId)  
  10. //              .taskAssignee(taskAssignee)//指定歷史任務的辦理人  
  11.             .list();  
  12.     if(list!=null && list.size()>0){  
  13.         for(HistoricTaskInstance hti:list){  
  14.             System.out.println(hti.getId()+"    "+hti.getName()+"    "+hti.getProcessInstanceId()+"   "+hti.getStartTime()+"   "+hti.getEndTime()+"   "+hti.getDurationInMillis());  
  15.             System.out.println("################################");  
  16.         }  
  17.     }     
  18.   
  19. }  


運行結果:

 

 

    504    提交申請   501   Fri Jun 26 09:34:51 CST2015   Fri Jun 26 09:50:50 CST 2015   959867

    ################################

    602    審批【部門經理】   501   Fri Jun 26 09:50:51 CST2015   null   null

    ################################

 

 

查詢流程是否結束

 

    咱們還能夠經過流程實例id查詢某個流程如今的狀態,是仍然在執行過程當中呢,仍是流程執行已經結束:

 

[java] view plain copy

  1. /** 
  2.  * 查詢流程狀態(判斷流程正在執行,仍是結束) 
  3.  */  
  4. @Test  
  5. public void isProcessEnd(){  
  6.     String processInstanceId =  "501";  
  7.     ProcessInstance pi = processEngine.getRuntimeService()//表示正在執行的流程實例和執行對象  
  8.             .createProcessInstanceQuery()//建立流程實例查詢  
  9.             .processInstanceId(processInstanceId)//使用流程實例ID查詢  
  10.             .singleResult();  
  11.       
  12.     if(pi==null){  
  13.         System.out.println("流程已經結束");  
  14.     }  
  15.     else{  
  16.         System.out.println("流程沒有結束");  
  17.     }  
  18.       
  19. }  

 

 

運行結果:

 

    流程沒有結束

 

3、總結

 

    咱們這篇文章主要是流程實例、執行對象、任務以及他們之間的關係進行了學習,同時咱們還將啓動和查詢流程實例、判斷流程實例是否執行結束、查看和辦理任務以及查詢歷史任務都進行了介紹。

 

11

 

7

 

 

相關文章
相關標籤/搜索