溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

activiti部署、執(zhí)行,完成簡單示例

發(fā)布時間:2020-07-26 06:18:56 來源:網(wǎng)絡(luò) 閱讀:1733 作者:亦輕塵 欄目:軟件技術(shù)

在工作流中,我們一切工作流的基本就是工作引擎(ProcessEngine),繼承于EngineService接口,包括流程部署,數(shù)據(jù)庫連接都是靠著ProcessEngine來實現(xiàn)的。而ProcessEngineConfiguration:流程引擎配置,可以設(shè)置數(shù)據(jù)庫等,默認的數(shù)據(jù)庫是h3,持久化實現(xiàn)使用的Mybatis,這里我們用的是mysql。

       那么既然無論是jbpm或者是activiti都需要ProcessEngine來驅(qū)動,那么我們就說一下工作流引擎的使用吧。

       流程部署

       當(dāng)我們將我們的業(yè)務(wù)畫成圖的時候,然后利用工作流引擎部署,也就是將我們的流程圖信息放到數(shù)據(jù)庫,圖和代碼如下:

         activiti部署、執(zhí)行,完成簡單示例

[java] view plain copy

  1. /**部署流程定義*/  

  2.     @Test  

  3.     public void deploymentProcessDefinition(){  

  4.         Deployment deployment = processEngine.getRepositoryService()  //用于流程定義和部署相關(guān)對象的Service  

  5.                         .createDeployment()   //創(chuàng)建一個部署對象  

  6.                         .name("leaveBill部門程序")  

  7.                         .addClasspathResource("diagrams/LeaveBill.bpmn"//從ClassPath資源中加載,一次只能加載一個文件  

  8.                         .addClasspathResource("diagrams/LeaveBill.png")  //從ClassPath資源中加載,一次只能加載一個文件  

  9.                         .deploy();  

  10.           

  11.         System.out.println("deployment" + deployment.getId());   //1  

  12.         System.out.println("deployment" + deployment.getName());//部門程序  

  13.       

  14.     }  

      打印結(jié)果如下:

      deployment1
      deploymenthellworld部門程序

      數(shù)據(jù)庫(部署相關(guān)表)解析

      我們看一下數(shù)據(jù)庫的表會發(fā)現(xiàn),每次部署都是涉及的那三張表,act_re_deployment(流程部署表)activiti部署、執(zhí)行,完成簡單示例

      該表包含了流程部署的名稱,ID,和部署時間

         act_re_procdef(流程定義表)activiti部署、執(zhí)行,完成簡單示例

      該表有流程定義的主鍵key,版本(version)源文件名和圖示,還有流程定義ID(key + 版本號+隨機生成的數(shù)字)

     act_ge_bytearray(資源文件表)     activiti部署、執(zhí)行,完成簡單示例

       保存了資源的位置和存儲方式和部署ID,版本號ID等信息

      act_ge_property:主鍵生成策略表

activiti部署、執(zhí)行,完成簡單示例

         定義了主鍵生成的策略信息

        執(zhí)行流程

        顧名思義,就是當(dāng)我們有一個人開始申請請假的時候我們就要執(zhí)行該請假的流程實例了

[java] view plain copy

  1. /** 

  2.  * 執(zhí)行流程實例 

  3.  */  

  4. @Test  

  5. public void startProcessInstance(){  

  6.     String processInstanceKey = "LeaveBill";  

  7.     ProcessInstance pi = processEngine.getRuntimeService()  

  8.                         .startProcessInstanceByKey(processInstanceKey);  

  9.     System.out.println("流程實例id:" + pi.getId());  //流程實例id  101  

  10.     System.out.println("流程定義id:" + pi.getProcessDefinitionId());   //流程定義ID helloworld:1:4  

  11. }  

        這樣我們的流程實例就啟動起來了,那么接下來我們看一下在啟動流程實例的時候我們涉及到的表信息

      數(shù)據(jù)庫分析(實例表)分析

       act_ru_execution: 正在執(zhí)行的執(zhí)行對象表,側(cè)重流程實例,對象,任務(wù)activiti部署、執(zhí)行,完成簡單示例

       包含了實例ID,流程定義ID,要執(zhí)行的任務(wù)名稱(usertask1)等信息

       act_ru_task:正在執(zhí)行的任務(wù)表,對具體的任務(wù)而言,任務(wù)執(zhí)行到哪里了

       activiti部署、執(zhí)行,完成簡單示例

     act_ru_identitylink流程信息變量act_hi_taskinst:已經(jīng)執(zhí)行完的歷史任務(wù)信息
activiti部署、執(zhí)行,完成簡單示例

act_hi_taskinst:已經(jīng)執(zhí)行完的歷史任務(wù)信息
act_hi_procinst:流程實例的歷史表,存放執(zhí)行完畢的流程實例信息

act_hi_actinst:存放歷史所有完成的活動

           現(xiàn)在我們對表有一個大致的了解,那么接下來我們就按照我們既定的流程去執(zhí)行我們的請假,例如第一個項目經(jīng)理叫張三,那么這個流程實例已啟動,首先需要張三去執(zhí)行操作,那么我們我們看一下張三的執(zhí)行任務(wù)的詳情,代碼如下:

[java] view plain copy

  1. /** 

  2.      * 查找個人當(dāng)前的要執(zhí)行的任務(wù) 

  3.      */  

  4.     @Test  

  5.     public void findMyTaskInfo(){  

  6.         String assignee = "張三";  

  7.         List<Task> listTask = processEngine.getTaskService()  

  8.             .createTaskQuery()  

  9.             .taskAssignee(assignee)  

  10.             .list();  

  11.           

  12.         if (listTask!= null && listTask.size() >0) {  

  13.             for (Task task : listTask) {  

  14.                 System.out.println("任務(wù)ID:" + task.getId());  

  15.                 System.out.println("任務(wù)名稱:" + task.getName());  

  16.                 System.out.println("任務(wù)時間:" + task.getCreateTime());  

  17.                 System.out.println("任務(wù)的班里人:" + task.getAssignee());  

  18.                 System.out.println("任務(wù)的實例ID:" + task.getProcessDefinitionId());  

  19.                 System.out.println("執(zhí)行對象的ID:" + task.getExecutionId());  

  20.                 System.out.println("任務(wù)的班里人:" + task.getAssignee());  

  21.                 System.out.println("流程定義ID:" + task.getProcessInstanceId());  

  22.             }  

  23.         }  

  24.               

  25.           

  26.     }  

       打印信息如下:任務(wù)ID:304,任務(wù)名稱:【項目經(jīng)理】審批,任務(wù)時間:Sat Jan 23 14:54:35 CST 2016,任務(wù)的班里人:張三 任務(wù)的實例ID:LeaveBill:2:204     執(zhí)行對象的ID:301   任務(wù)的班里人:張三  流程定義ID:301

       任務(wù)完成

        那么接下來我就把任務(wù)ID為304的一個流程結(jié)束,也就是項目經(jīng)理同意請假,代碼如下:

[java] view plain copy

  1. /**完成任務(wù)*/  

  2. @Test  

  3. public void completeMyPersoinTask() {  

  4.     String taskId = "304";  

  5.     processEngine.getTaskService()  

  6.     .complete(taskId);  

  7.       

  8.     System.out.println("完成任務(wù),任務(wù)ID:" + taskId);  

  9. }  

        然后我繼續(xù)執(zhí)行查詢個人任務(wù)的時候,我們只能查到主任的任務(wù)了,因為項目經(jīng)理已經(jīng)執(zhí)行完畢,所以當(dāng)前執(zhí)行的任務(wù)是看不到的,但是在歷史信息中是存在的。

       如果我們啟動了實例的話,查詢當(dāng)前信息的話,實在act_ru_*的表中查詢,根據(jù)任務(wù)有關(guān)的服務(wù),都是taskService,當(dāng)然Activiti還有很多的服務(wù),例如RepositoryService,RuntimeService, HistoryService等服務(wù)。

      大致總結(jié)一下,就是先部署,再啟動,個人登陸系統(tǒng)后,根據(jù)個人姓名,查到任務(wù)ID,完成個人任務(wù),直到全部完成


向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI