前言
Activiti的參數有兩種類型,一類是流程參數,一類是任務參數;流程參數是通過RuntimeService服務組件設置,在設置的過程中需要傳入執行流ID;任務參數是通過TaskService服務組件設置,在設置的過程中需要傳入任務ID;所以我們可以形象的認爲流程參數是和執行流綁定到了一起,任務參數是和任務綁定到了一起。任務參數可以查看這篇文章《Activiti任務參數的設置方式和作用域》
一、流程參數有兩種設置方式
1:啓動流程實例時設置參數,用runtimeService.startProcessInstanceById(流程id,參數map);此種方式設置的流程參數相當於設置到了主執行流中。
2:在流程啓動之後,用runtimeService.setVariable(執行流Id,參數名,參數值)或者runtimeService.setVariableLocal(執行流Id,參數名,參數值)的方式設置參數;此種方式設置參數依靠執行流,可以是主執行流,也可以是子執行流。
二、流程參數的作用域
1:流程實例中只有一個執行流時,即只有主執行流時;無論是在啓動流程時設置流程參數,還是在啓動後通過setVariable或者通過setVariableLocal的方式來設置流程參數,則都可以通過getVariable和getVariableLocal的方式獲取到設置的流程參數;
2:流程實例中除了主執行流外,還有子執行流時;此時情況比較複雜,分開描述:
(1)當在主執行流中設置流程參數,無論以何種方式設置,則在主執行流中通過任何方式都可以獲取到,在所有子執行流中也可以通過getVariable的方式獲取到;
(2)當在某個子執行流中設置流程參數時,如果是通過setVariable方式設置,則在所有子執行流中都可以通過getVariable方式獲取到,在主執行流中可以通過任何方式獲取到;
(3)當在某個子執行流中設置流程參數時,如果是以setVariableLocal方式設置,則在當前子執行流中可以通過任何方式獲取到,在其他子執行流中不可以獲取到,在主執行流中也不可以獲取到,因爲參數的作用域僅僅侷限於當前設置的子執行流中,而且子執行流執行結束之後,參數就會失效。
3:流程參數作用域的個人理解
(1)在一個流程實例中,流程參數的作用域可以理解爲有兩類區域,一類共有區域(只有一個共有區域,所有執行流共享),一類私有區域(每個子執行流都有自己的私有區域);
(2)主執行流只能操作共有區域,無論是通過setVariable和getVariable,還是通過setVariableLocal和getVariableLocal;操作的都是共享的那個共有區域;
(3)子執行流即可以操作共有區域(setVariable和getVariable),也可以操作自己的私有區域(setVariableLocal和getVariableLocal)(子執行流的getVariable也可以操作自己的私有區域);
(4)主執行流無論通過何種方式設置參數,都是將參數設置到共有區域中;主執行流無論通過何種方式獲取都是從共有區域中獲取參數;
(5)子執行流通過setVariable設置的參數,被設置到了共有區域;子執行流通過getVariable方式是從共有區域裏獲取參數(也會從自己的私有區域獲取參數);
(6)子執行流通過setVariableLocal設置的參數,被設置到了自己的私有區域裏;子執行流通過getVariableLocal從自己的私有區域裏獲取參數。
4:流程參數在數據庫中的表現形式
(1)現象
- 主執行流id爲2501(和流程實例id一樣),子執行流id爲7502和7503;
- 在主執行流中設置的參數的參數名有start、local、nolocal,它們的的EXECUTION_ID_字段的值都是主執行流的id2501;
- 在子執行流7502中通過setVariableLocal設置的參數的參數名爲7502,它的的EXECUTION_ID_字段的值是該子執行流的id7502;
- 在子執行流7503中通過setVariable設置的參數的參數名爲7503,它的EXECUTION_ID_字段的值是主執行流的id2501;
(2)總結
- 被放置到共有區域的參數的EXECUTION_ID_字段的值都是主執行流的id,被放到子執行流私有區域的參數的EXECUTION_ID_字段的值爲該子執行流的id
- 通過主執行流的任何方式獲取參數時,都是以主執行流的id爲條件從變量表的EXECUTION_ID_中查找參數;
- 通過子執行流的getVariableLocal方式獲取參數時,以子執行流的id爲條件從變量表的EXECUTION_ID_中查找參數;
- 通過子執行流的getVariable方式獲取參數時,不僅以主執行流的id爲條件從變量表的EXECUTION_ID_中查找參數,還以該子執行流的id爲條件從變量表的EXECUTION_ID_中查找參數;