1. 程式人生 > >Activiti——流程變數(六)

Activiti——流程變數(六)

Activiti——流程變數

流程變數在整個工作流中扮演很重要的作用。例如:請假流程中有請假天數、請假原因等一些引數都為流程變數的範圍。流程變數的作用域範圍是只對應一個流程例項。也就是說各個流程例項的流程變數是不相互影響的。流程例項結束完成以後流程變數還儲存在資料庫中(存放到流程變數的歷史表中)。

一、部署流程定義

ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

    /** 部署流程定義(從InputStream) */
    @Test
    public void deploymentProcessDefinition_inputStream
() { InputStream inputStreambpmn = this.getClass().getResourceAsStream("/diagrams/processVariables.bpmn"); InputStream inputStreampng = this.getClass().getResourceAsStream("/diagrams/processVariables.png"); Deployment deployment = processEngine.getRepositoryService()// 與流程定義和部署物件相關的Service
.createDeployment()// 建立一個部署物件 .name("流程定義")// 新增部署的名稱 .addInputStream("processVariables.bpmn", inputStreambpmn)// 使用資原始檔的名稱(要求:與資原始檔的名稱要一致),和輸入流完成部署 .addInputStream("processVariables.png", inputStreampng)// 使用資原始檔的名稱(要求:與資原始檔的名稱要一致),和輸入流完成部署 .deploy();// 完成部署
System.out.println("部署ID:" + deployment.getId());// System.out.println("部署名稱:" + deployment.getName());// }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

說明: 
輸入流載入資原始檔的3種方式 
這裡寫圖片描述
這裡寫圖片描述

二、啟動流程例項

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

三、設定流程變數

/** 設定流程變數 */
    @Test
    public void setVariables() {
        /** 與任務(正在執行) */
        TaskService taskService = processEngine.getTaskService();
        // 任務ID
        String taskId = "2104";
        /** 一:設定流程變數,使用基本資料型別 */
        // taskService.setVariableLocal(taskId, "請假天數", 5);//與任務ID繫結
        // taskService.setVariable(taskId, "請假日期", new Date());
        // taskService.setVariable(taskId, "請假原因", "回家探親,一起吃個飯");
        /** 二:設定流程變數,使用javabean型別 */
        /**
         * 當一個javabean(實現序列號)放置到流程變數中,要求javabean的屬性不能再發生變化 * 如果發生變化,再獲取的時候,丟擲異常
         * 
         * 解決方案:在Person物件中新增: private static final long serialVersionUID =
         * 6757393795687480331L; 同時實現Serializable
         */
        Person p = new Person();
        p.setId(20);
        p.setName("翠花");
        taskService.setVariable(taskId, "人員資訊(新增固定版本)", p);

        System.out.println("設定流程變數成功!");
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

說明:

  1. 流程變數的作用域就是流程例項,所以只要設定就行了,不用管在哪個階段設定
  2. 基本型別設定流程變數,在taskService中使用任務ID,定義流程變數的名稱,設定流程變數的值。
  3. Javabean型別設定流程變數,需要這個javabean實現了Serializable介面
  4. 設定流程變數的時候,向act_ru_variable這個表新增資料

四、獲取流程變數

/** 獲取流程變數 */
    @Test
    public void getVariables() {
        /** 與任務(正在執行) */
        TaskService taskService = processEngine.getTaskService();
        // 任務ID
        String taskId = "2104";
        /** 一:獲取流程變數,使用基本資料型別 */
        // Integer days = (Integer) taskService.getVariable(taskId, "請假天數");
        // Date date = (Date) taskService.getVariable(taskId, "請假日期");
        // String resean = (String) taskService.getVariable(taskId, "請假原因");
        // System.out.println("請假天數:"+days);
        // System.out.println("請假日期:"+date);
        // System.out.println("請假原因:"+resean);
        /** 二:獲取流程變數,使用javabean型別 */
        Person p = (Person) taskService.getVariable(taskId, "人員資訊(新增固定版本)");
        System.out.println(p.getId() + "        " + p.getName());
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

說明:

  1. 流程變數的獲取針對流程例項(即1個流程),每個流程例項獲取的流程變數時不同的
  2. 使用基本型別獲取流程變數,在taskService中使用任務ID,流程變數的名稱,獲取流程變數的值。
  3. Javabean型別設定獲取流程變數,除了需要這個javabean實現了Serializable介面外,還要求流程變數物件的屬性不能發生變化,否則丟擲異常。解決方案,固定序列化ID

五、模擬流程變數的設定和獲取的場景

/** 模擬設定和獲取流程變數的場景 */
    public void setAndGetVariables() {
        /** 與流程例項,執行物件(正在執行) */
        RuntimeService runtimeService = processEngine.getRuntimeService();
        /** 與任務(正在執行) */
        TaskService taskService = processEngine.getTaskService();

        /** 設定流程變數 */
        // runtimeService.setVariable(executionId, variableName,
        // value)//表示使用執行物件ID,和流程變數的名稱,設定流程變數的值(一次只能設定一個值)
        // runtimeService.setVariables(executionId,
        // variables)//表示使用執行物件ID,和Map集合設定流程變數,map集合的key就是流程變數的名稱,map集合的value就是流程變數的值(一次設定多個值)

        // taskService.setVariable(taskId, variableName,
        // value)//表示使用任務ID,和流程變數的名稱,設定流程變數的值(一次只能設定一個值)
        // taskService.setVariables(taskId,
        // variables)//表示使用任務ID,和Map集合設定流程變數,map集合的key就是流程變數的名稱,map集合的value就是流程變數的值(一次設定多個值)

        // runtimeService.startProcessInstanceByKey(processDefinitionKey,
        // variables);//啟動流程例項的同時,可以設定流程變數,用Map集合
        // taskService.complete(taskId, variables)//完成任務的同時,設定流程變數,用Map集合

        /** 獲取流程變數 */
        // runtimeService.getVariable(executionId,
        // variableName);//使用執行物件ID和流程變數的名稱,獲取流程變數的值
        // runtimeService.getVariables(executionId);//使用執行物件ID,獲取所有的流程變數,將流程變數放置到Map集合中,map集合的key就是流程變數的名稱,map集合的value就是流程變數的值
        // runtimeService.getVariables(executionId,
        // variableNames);//使用執行物件ID,獲取流程變數的值,通過設定流程變數的名稱存放到集合中,獲取指定流程變數名稱的流程變數的值,值存放到Map集合中

        // taskService.getVariable(taskId,
        // variableName);//使用任務ID和流程變數的名稱,獲取流程變數的值
        // taskService.getVariables(taskId);//使用任務ID,獲取所有的流程變數,將流程變數放置到Map集合中,map集合的key就是流程變數的名稱,map集合的value就是流程變數的值
        // taskService.getVariables(taskId,
        // variableNames);//使用任務ID,獲取流程變數的值,通過設定流程變數的名稱存放到集合中,獲取指定流程變數名稱的流程變數的值,值存放到Map集合中

    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

說明:

  1. RuntimeService物件可以設定流程變數和獲取流程變數
  2. TaskService物件可以設定流程變數和獲取流程變數
  3. 流程例項啟動的時候可以設定流程變數
  4. 任務辦理完成的時候可以設定流程變數
  5. 流程變數可以通過名稱/值的形式設定單個流程變數
  6. 流程變數可以通過Map集合,同時設定多個流程變數 
    Map集合的key表示流程變數的名稱 
    Map集合的value表示流程變數的值

六、查詢歷史的流程變數

/** 查詢流程變數的歷史表 */
    @Test
    public void findHistoryProcessVariables() {
        List<HistoricVariableInstance> list = processEngine.getHistoryService()//
                .createHistoricVariableInstanceQuery()// 建立一個歷史的流程變數查詢物件
                .variableName("請假天數").list();
        if (list != null && list.size() > 0) {
            for (HistoricVariableInstance hvi : list) {
                System.out.println(hvi.getId() + "   " + hvi.getProcessInstanceId() + "   " + hvi.getVariableName()
                        + "   " + hvi.getVariableTypeName() + "    " + hvi.getValue());
                System.out.println("###############################################");
            }
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

說明: 
歷史的流程變數查詢,指定流程變數的名稱,查詢act_hi_varinst表(也可以針對,流程例項ID,執行物件ID,任務ID查詢)

七、流程變數的支援的型別

Type name Description
string Value is threaded as a java.lang.String. Raw JSON-text value is used when writing a variable.
integer Value is threaded as a java.lang.Integer. When writing, JSON number value is used as base for conversion, falls back to JSON text.
short Value is threaded as a java.lang.Short. When writing, JSON number value is used as base for conversion, falls back to JSON text.
long Value is threaded as a java.lang.Long. When writing, JSON number value is used as base for conversion, falls back to JSON text.
double Value is threaded as a java.lang.Double. When writing, JSON number value is used as base for conversion, falls back to JSON text.
boolean Value is threaded as a java.lang.Boolean. When writing, JSON boolean value is used for conversion.
date Value is treated as a java.util.Date. When writing, the JSON text will be converted using ISO-8601 date format.
binary Binary variable, treated as an array of bytes. The value attribute is null, the valueUrl contains an URL pointing to the raw binary stream.
serializable Serialized representation of a Serializable Java-object. As with the binary type, the value attribute is null, the valueUrl contains an URL pointing to the raw binary stream. All serializable variables (which are not of any of the above types) will be exposed as a variable of this type.

從圖中可以看出包括了大部分封裝型別和Date、String和實現了Serializable介面的類的型別。

八、總結

  1. 流程變數 
    在流程執行或者任務執行的過程中,用於設定和獲取變數,使用流程變數在流程傳遞的過程中傳遞業務引數。 
    對應的表: 
    act_ru_variable:正在執行的流程變量表 
    act_hi_varinst:流程變數歷史表
  2. 擴充套件知識:setVariable和setVariableLocal的區別 
    setVariable:設定流程變數的時候,流程變數名稱相同的時候,後一次的值替換前一次的值,而且可以看到TASK_ID的欄位不會存放任務ID的值 
    setVariableLocal: 
    1:設定流程變數的時候,針對當前活動的節點設定流程變數,如果一個流程中存在2個活動節點,對每個活動節點都設定流程變數,即使流程變數的名稱相同,後一次的版本的值也不會替換前一次版本的值,它會使用不同的任務ID作為標識,存放2個流程變數值,而且可以看到TASK_ID的欄位會存放任務ID的值 
    例如act_hi_varinst 表的資料:不同的任務節點,即使流程變數名稱相同,存放的值也是不同的。 
    如圖: 
    這裡寫圖片描述 
    2:還有,使用setVariableLocal說明流程變數綁定了當前的任務,當流程繼續執行時,下個任務獲取不到這個流程變數(因為正在執行的流程變數中沒有這個資料),所有查詢正在執行的任務時不能查詢到我們需要的資料,此時需要查詢歷史的流程變數。

相關推薦

Activiti——流程變數

Activiti——流程變數 流程變數在整個工作流中扮演很重要的作用。例如:請假流程中有請假天數、請假原因等一些引數都為流程變數的範圍。流程變數的作用域範圍是只對應一個流程例項。也就是說各個流程例項的流程變數是不相互影響的。流程例項結束完成以後流程變數還儲存在資料庫中(

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

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

Activiti的學習——閘道器

閘道器用來控制流程的流向。 閘道器顯示成菱形圖形,內部有有一個小圖示。 圖標表示閘道器的型別。 一、排他閘道器(ExclusiveGateWay) 排他閘道器(也叫異或(XOR)閘道器,或更技術性的叫法 基於資料的排他閘道器), 用來在流程中實現決策。 圖形標記 排他閘道器

activiti 流程歷史

package diagrams; import java.util.List; import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngines; import or

SpringBoot啟動流程分析:IoC容器依賴注入

SpringBoot系列文章簡介 SpringBoot原始碼閱讀輔助篇:   Spring IoC容器與應用上下文的設計與實現 SpringBoot啟動流程原始碼分析: SpringBoot啟動流程分析(一):SpringApplication類初始化過程 SpringBoot啟動流程分析(二)

Activiti的學習——流程變數操作、任務型別

ProcessEngine pe = null; @Before public void init() { pe = ProcessEngines.getDefaultProcessEngine(); } 一、流程變數操作 流程變數指的是

activiti自定義流程之Spring整合activiti-modeler5.16例項:啟動流程

1.啟動流程並分配任務是單個流程的正式開始,因此要使用到runtimeService介面,以及相關的啟動流程的方法。我習慣於用流程定義的key啟動,因為有多個版本的流程定義時,用key啟動預設會使用最新版本。同時,因為啟動中查詢了流程部署時xml檔案中流程節點的資訊,也用

Activiti檢視流程歷史記錄

1.畫流程圖。 2.部署流程。 3.啟動流程例項。 4.檢視流程任務(可無)。 5.辦理任務。 6.檢視流程歷史記錄。 流程引擎: ProcessEngine pe = ProcessEngines.

activiti自定義流程之整合:獲取我的申請任務

流程啟動後,流程節點便進入到了任務相關的部分。可以看到我之前的做法是在啟動節點就綁定了form表單,啟動時就填寫相關的資料。實際上在之前我的做法是不對開始節點做任何操作,知道任務節點的時候再填寫相關的資料進行設定。 至於這兩種方式的優劣,我暫時還不太確定,單獨從功能上來說

SparkSpark任務提交方式和執行流程

sla handles 解析 nod 就會 clust 它的 管理機 nag 一、Spark中的基本概念 (1)Application:表示你的應用程序 (2)Driver:表示main()函數,創建SparkContext。由SparkContext負責與Cluste

從零開始學習比特幣--P2P網路建立的流程之查詢DNS節點

上節開始我們已經開始講解比特幣系統中P2P網路是如何建立的。還記得在比特幣系統啟動的的第12步的講解中,我們提到有幾個執行緒相關的處理非常重要嗎?以下內容正是基於此做了詳細的講解。由於篇幅過長,我們分幾篇文章依次道來。 P2P 網路的建立是在比特幣系統啟動的第 12 步,最後時刻呼叫 C

python3教程變數

我們之前對字串數字進行操作,應該會發現一些問題,python素來以簡潔著稱,但是在字串操作時也沒發現有多簡潔。短一點的字串還好,如果是幾百個字元的字串,每呼叫一次就要打幾百個字元,即使複製工作量也很大。 python中其實有一個變數可以解決這個問題。 #變數和賦值的概念也有一定的關係,其

智慧合約基礎語言——Solidity變數型別:其他

智慧合約基礎語言(六):Solidity變數型別:其他 一、目錄 ☞對映 ☞特殊的運算子delete ☞基本類間的轉換 二、變數型別——對映 對映或字典型別,一種鍵值對的對映關係儲存結構。定義方式為mapping(_KeyType => _K

跟廠長學PHP核心7變數之zval

記得網上流傳甚廣的段子“PHP是世界上最好的語言”,暫且不去討論是否言過其實,但至少PHP確實有獨特優勢的,比如它的弱型別,即只需要$符號即可宣告變數,使得PHP入手門檻極低,成為大家所青睞的Web服務端語言。那麼它的變數是如何實現的呢?我們今天就來學習一下PHP的基本變數。 一、引言 PHP的變數儲存在

Javascript筆記之程式結構與流程控制語句

一、程式結構簡介 1、幾個基本概念 程式結構分為順序結構、分支結構、迴圈結構,通常伴隨著這幾種程式結構存在的還有流程控制語句; 在ECMA-262規定來一組流程控制語句,語句定義了ECMAScript中的主要語法,語法通常由一個或多個關鍵字來完成給定的任務,例如

java學習筆記------變數與封裝附加預習時在網上搜索的java訪問許可權

1.成員變數 定義於類內且類方法外的變數,生存期為整個類,類似C語言的全域性變數 定義時一般加private,為類的私有,其他類沒有直接訪問許可權 2.區域性變數 一般定義於類方法內,生存期為整個方法,相當於C語言的區域性變數 定義時一般加public 3.類圖:   

Activiti進階——流程定義的CRUD

     流程定義的RCUD,也就是對流程的增刪該查,這篇博文簡單的為大家介紹一下使用Activiti的api對流程定義進行增刪改查操作。 一、檢視流程定義 // 查詢流程定義 @Test

RewriteCond 呼叫伺服器變數 TestString使用說明%1-9

TestString 使用說明 %{NAME_OF_VARIABLE}  伺服器變數引用 RewriteCond %{HTTM_HOST} "127.0.0.1"   用法 編寫規則 RewriteEngine on RewriteCond %{HT

國際貿易基礎外貿流程

外貿出口流程主要包括:報價、訂貨、付款方式、備貨、包裝、報檢、報關、裝船、提 單、交單、結匯。用幾個字來簡單概括的話,就是“約-貨-款-運-單”。和國內貿易相比,多 了或更強調“單”即運輸單據,比如發票、裝箱單和提單等,其中海運提單是貨權憑證,一 定意義上提單就是貨也是款,這是由國際貿易的政策、運輸、貨幣等特

ActivitiSSH專案實戰

1.1 建立專案 1.2 新增Jar包 1.3 更改配置檔案 1.3.1 連線資料庫 1.3.2 Spring檔案的配置 2 專案配置 applicationContext-dao.xml <bean id="employee