1. 程式人生 > >Activiti學習筆記六 流程例項 任務 執行物件控制流程執行

Activiti學習筆記六 流程例項 任務 執行物件控制流程執行

上一篇我們看了流程定義,我們接下來看一下流程例項,任務,和執行物件。

流程例項 任務的執行

1.流程圖

2.部署流程定義

    private final ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

    /**
     * 功能: 部署流程定義zip.<br/>
     * date: 2014年12月16日 下午2:09:03 <br/>
     * 
     * @author [email protected]
     */
    @Test
    public void deploymentProcessDefinitionByZip() {
        InputStream in = this.getClass().getClassLoader().getResourceAsStream("diagrams/helloworld.zip");
        ZipInputStream zipInputStream = new ZipInputStream(in);
        Deployment deployment = processEngine.getRepositoryService()
        // 與流程定義和部署相關的Service
                .createDeployment()
                // 建立部署物件
                .name("流程定義")
                // 部署名稱
                .addZipInputStream(zipInputStream) // 指定zip檔案
                .deploy(); // 部署
        System.out.println("部署ID:" + deployment.getId());
        System.out.println("部署名稱:" + deployment.getName());
    }


3.啟動流程例項

/**
     * 功能: 啟動流程例項.<br/>
     * date: 2014年12月15日 下午5:25:37 <br/>
     * 
     * @author [email protected]
     */
    @Test
    public void startProcessInstance() {
        // 流程定義的key
        String processDefinitionKey = "helloworld";
        ProcessInstance pi = processEngine.getRuntimeService()// 獲取正在執行的流程例項和執行物件相關的Service
                .startProcessInstanceByKey(processDefinitionKey); // 使用流程定義的key啟動流程例項
                                                                  // key
                                                                  // 對應helloworld.bpmn中的Id屬性
        System.out.println(pi.getId()); // 流程例項Id 601
        System.out.println(pi.getProcessDefinitionId()); // 流程定義Id
                                                         // helloworld:1:504
    }

操作資料庫的act_ru_execution表,如果是使用者任務節點,同時也會在act_ru_task新增一條記錄

act_ru_execution #正在執行的執行物件表

   執行物件ID                                                                           流程例項ID

act_hi_procinst   #流程例項的歷史表

   執行物件ID                              流程例項ID

結論 1.如果是單例流程(沒有分支和聚合),那麼流程例項ID和執行物件ID是相同的 2.一個流程流程例項只有一個,執行物件可以存在多個(如果存在分支和聚合) 注意:本例是單例流程,要想測試第二個結論,可以再畫一張有分支的流程圖來測試。

4.查詢個人任務 

/**
     * 功能: 查詢當前人的個人任務.<br/>
     * date: 2014年12月16日 上午11:00:46 <br/>
     * 
     * @author [email protected]
     */
    @Test
    public void queryMyTask() {
        String assignee = "李四";
        List<Task> list = processEngine.getTaskService()// 獲取正在執行的任務相關的Service
                .createTaskQuery()// 建立任務查詢物件
                .taskAssignee(assignee)// 指定任務辦理人
                // .taskCandidateUser(candidateUser) //組任務的辦理人查詢
                // .processDefinitionId(processDefinitionId)//使用流程定義Id查詢
                // .processInstanceId(processInstanceId) //使用流程例項Id查詢
                // .executionId(executionId) //使用執行物件Id查詢
                /** 排序 */
                .orderByTaskCreateTime().asc() // 使用建立時間的升序
                /** 返回結果集 */
                // .singleResult()// 返回唯一結果集
                // .count() // 返回結果集的數量
                // .listPage(firstResult, maxResults)//分頁查詢
                .list();
        if (null != list && list.size() > 0) {
            for (Task task : list) {
                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("################################");
            }
        }
    }


說明:

        1)因為是任務查詢,所以從processEngine中應該得到TaskService

        2)使用TaskService獲取到任務查詢物件TaskQuery

        3)為查詢物件新增查詢過濾條件,使用taskAssignee指定任務的辦理者(即查詢指定使用者的代辦任務),同時可以新增分頁排序等過濾條件

        4)呼叫list方法執行查詢,返回辦理者為指定使用者的任務列表

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

        6)單例流程中ProcessInstance相當於Execution

        7)如果assignee屬性為部門經理,結果為空。因為現在流程只到了”填寫請假申請”階段,後面的任務還沒有執行,即在資料庫中沒有部門經理可以辦理的任務,所以查詢不到

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

        9)任務ID在資料庫表act_ru_task中對應“ID_”列

附加

activiti任務中,主要分為兩大類查詢任務(個人任務和組任務):

1.確切指定了辦理者的任務,這個任務將成為指定者的私有任務,即個人任務。

2.無法指定具體的某一個人來辦理的任務,可以把任務分配給幾個人或者一到多個小組,讓這個範圍內的使用者可以選擇性(如有空餘時間時)來辦理這類任務,即組任務。

act_ru_task  #正在執行的任務表

任務ID                                                                                   執行物件ID                          流程例項ID

act_hi_taskinst #任務歷史表

                                                                                                                                         辦理人                       開始時間                                                       結束時間

act_hi_actinst #所有活動節點的歷史表

5.辦理任務

/**
     * 功能: 完成任務.<br/>
     * date: 2014年12月17日 下午5:24:44 <br/>
     * 
     * @author [email protected]
     */
    @Test
    public void completeMyTask() {
        String taskId = "1402";
        processEngine.getTaskService()// 獲取任務相關Service
                .complete(taskId);
        System.out.println("完成任務:任務ID:" + taskId);
    }

說明:

        1)是辦理任務,所以從ProcessEngine得到的是TaskService

        2)當執行完這段程式碼,再以員工的身份去執行查詢的時候,會發現這個時候已經沒有資料了,因為正在執行的任務中沒有資料

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

        4)以”部門經理”的身份進行查詢,可以查到結果。因為流程執行到部門經理審批這個節點了

        5)再執行辦理任務程式碼,執行完以後以”部門經理”身份進行查詢,沒有結果、

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

6.查詢流程狀態

/**
     * 功能: 查詢流程狀態(判斷流程正在執行,還是結束).<br/>
     * date: 2014年12月22日 下午3:52:22 <br/>
     * 
     * @author [email protected]
     */
    @Test
    public void isProcessEnd() {
        String processInstanceId = "1201";
        ProcessInstance pi = processEngine.getRuntimeService()// 正在執行的流程例項和執行物件相關Service
                .createProcessInstanceQuery() // 建立流程例項查詢
                .processInstanceId(processInstanceId) // 使用流程例項ID查詢
                .singleResult();
        if (null == pi) {
            System.out.println("流程已經結束!");
        } else {
            System.out.println("流程正在執行!");
        }
    }

在流程執行的過程中,建立的流程例項ID在整個過程中都不會變,當流程結束後,流程例項將會在正在執行的執行物件表中(act_ru_execution)被刪除

說明:

       1)因為是查詢流程例項,所以先獲取runtimeService

       2)建立流程例項查詢物件,設定例項ID過濾引數

       3)由於一個流程例項ID只對應一個例項,使用singleResult執行查詢返回一個唯一的結果,如果結果數量大於1,則丟擲異常

       4)判斷指定ID的例項是否存在,如果結果為空,則代表流程結束,例項在正在執行的執行物件表中已被刪除,轉換成歷史資料

 
7.查詢歷史任務 

/**
     * 功能: 查詢歷史任務.<br/>
     * date: 2014年12月22日 下午4:15:55 <br/>
     * 
     * @author [email protected]
     */
    @Test
    public void findHistoryTask() {
        String taskAssignee = "張三";
        List<HistoricTaskInstance> list = processEngine.getHistoryService()// 與歷史資料相關的Service
                .createHistoricTaskInstanceQuery() // 建立歷史任務例項查詢
                .taskAssignee(taskAssignee) // 指定辦理人
                .list();
        if (null != list && list.size() > 0) {
            for (HistoricTaskInstance hist : list) {
                System.out.println(hist.getId() + "   " + hist.getName() + "   " + hist.getProcessInstanceId() + "   "
                                   + hist.getStartTime());
                System.out.println("#########################");
            }
        }
    }

8.查詢歷史流程例項 

/**
     * 功能: 查詢歷史流程例項.<br/>
     * date: 2014年12月22日 下午4:25:13 <br/>
     * 
     * @author [email protected]
     */
    @Test
    public void findHistoryProcessInstance() {
        String processInstanceId = "1201";
        HistoricProcessInstance hpi = processEngine.getHistoryService()// 與歷史資料相關的Service
                .createHistoricProcessInstanceQuery() // 建立歷史流程例項查詢
                .processInstanceId(processInstanceId) // 使用流程例項Id查詢
                .singleResult();
        System.out.println(hpi.getId() + "    " + hpi.getProcessDefinitionId() + "   " + hpi.getStartTime() + "   "
                           + hpi.getEndTime());
    }


總結:

按流程定義的規則執行一次的過程.

對應的表:

 act_ru_execution:正在執行的資訊

 act_hi_procinst:已經執行完的歷史流程例項資訊

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

ProcessInstance 流程例項

特指流程從開始到結束的那個最大的執行分支,一個執行的流程中,流程例項只有1個。

注意

1)如果是單例流程,執行物件ID就是流程例項ID

2)如果一個流程有分支和聚合,那麼執行物件ID和流程例項ID就不相同

3)一個流程中,流程例項只有1個,執行物件可以存在多個

Task任務

執行到某任務環節時生成的任務資訊

對應的表:

  act_ru_task:正在執行的任務資訊

  act_hi_taskinst:已經執行完的歷史任務資訊

相關推薦

Activiti學習筆記 流程例項 任務 執行物件控制流程執行

上一篇我們看了流程定義,我們接下來看一下流程例項,任務,和執行物件。 流程例項 任務的執行 1.流程圖 2.部署流程定義 private final ProcessEngine processEngine = ProcessEngines.getDefaultP

Activiti工作流】8.流程例項任務執行物件控制流程執行

我們之前講過了流程的定義,啟動,檢視和刪除,以及升級版本,接下來當流程 正式啟動成功之後,我們就要學習流程例項/任務的執行了。 1,流程例項/任務的執行 (1)啟動流程例項 (這裡前提是大家部署好了流程)/** * 啟動流程 * 當流程到達一個節點時,會在act_ru_

工作流4-流程例項任務執行物件控制流程執行

流程例項: 從開始到結束 流程物件: 一個流程,流程例項只有一個,執行物件可以存在多個 1.啟動流程例項 public void startProcessInstance(){ //流程定義的key,根據key啟動最新version流程 String pr

Maven學習筆記()-使用Eclipse建立Maven WEB專案以及執行專案的幾種方式

一、建立一個專案 在eclipse選單欄中選擇“File”---“News”---“Other”選單項,就會開啟如下對話視窗,在視窗中選擇“Maven”節點下“Maven Project”條目,如下

Activiti學習筆記Activiti流程引擎API和服務

引擎API是與Activiti互動的最常見方式。中心起點是ProcessEngine,可以通過多種方式建立,如《Activiti學習筆記(三)獲取ProcessEngine物件的多種方式》。 從ProcessEngine中,可以獲得包含工作流BPM方法的各種服務。一下是Activiti的模型圖 一共有

Java多執行學習筆記() synchronized(this)同步語句塊

synchronized (this)同步語句塊 1. 一半非同步,一半同步 1.1 Task 1.2 ThreadA 1.3 ThreadB 1.4 Test 1.5 執行結果 2. synchronize

大資料技術學習筆記之Hadoop框架基礎2-MapReduce程式設計及執行流程

一、回顧     -》hadoop的功能?         -》海量資料儲存和海量計算問題         -》分散式檔案儲存框架hdfs和

執行學習筆記之併發工具類CountDownLatch和CyclicBarrier

目錄 簡介 CountDownLatch 示例 實現分析 CountDownLatch與Thread.join() CyclicBarrier 實現分析 CountDownLatch和CyclicBarrier區別 簡介

rocketmq學習筆記 流程之存訊息

private RemotingCommand sendMessage(final ChannelHandlerContext ctx, // final RemotingCommand request, //

rocketmq學習筆記 流程之取訊息

前面一章學習了,客戶端拉訊息的流程,那麼broker端得到RemotingCommand 之後怎麼操作呢? 請聽本文的分析 流程圖 核心程式碼 PullMessageProcessor private RemotingCommand processReques

linux多執行學習筆記--一次性初始化和執行緒私有資料

pthread_key_t key; int pthread_key_create(pthread_key *key,void (*destructor)(void*)); int pthread_key_delete(pthread_key_t key); 該函式從TSD池中分配一項,將其值賦給key供以

Activiti 學習筆記13:分配組任務

一、流程圖 二、分配組任務方式一(直接指定辦理人) 1:流程圖中任務節點的配置 2:測試程式碼 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

Caffe學習筆記():mnist手寫數字識別訓練例項

一、前言    深度學習的一個簡單例項就是mnist手寫數字識別,只要這個例子弄明白,其它的內容就可以舉一反三了。之前的內容如有遺忘,可以進行回顧。 二、準備資料    資料集可以直接從我的github下載,包括資料集和程式碼,使用如下指令:

JAVA學習筆記(十)- 網路程式設計登入例項

客戶端 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import ja

Activiti 學習筆記五:流程變數

流程變數在整個工作流中扮演很重要的作用。例如:請假流程中有請假天數、請假原因等一些引數都為流程變數的範圍。流程變數的作用域範圍是只對應一個流程例項。也就是說各個流程例項的流程變數是不相互影響的。流程例項

吳裕雄--天生自然python學習筆記:python通過“任務計劃程式”實現定時自動下載或更新執行 PM2.5 資料抓取程式資料

在 Windows 任務計劃程式中,設定每隔 30 分鐘自動抓取 PM2.5 資料,井儲存 在 SQLite 資料庫中 。     import sqlite3,ast,requests,os from bs4 import BeautifulSoup #cur_path=os

Python學習筆記:文件處理

alt 筆記 lin 系統 顯式 當前位置 open 刷新 大小 一:打開文件 open(name,mode,[bufferSize]) name:文件路徑 mode:文件打開方式 二:文件讀取 read()方法:可以一次讀取文件的全部內容,Python把內容讀到

Android第一行代碼學習筆記---Intent向活動傳遞數據

一行 而已 activity ase 是否 button can ride 重載 @1、向下一個活動傳遞數據: Intent提供了一系列putExtra()方法的重載,可以把我們想要傳遞的數據暫存在Intent中,啟動了另一個活動後,只需把這些數據再從Intent中取出就可

activiti學習筆記---常見異常

exce 方法 ons 版本 med 不存在 code ssl cloc Activiti中的基礎異常為org.activiti.engine.ActivitiException,一個非檢查異常, 這個異常可以在任何時候被API拋出。 為了避免過多的異常繼承,下面的子類用於

<Bootstrap> 學習筆記. 柵格系統使用案例

柵格 3.2 btn nta head ext ont ces str <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <t