《Activiti實戰》筆記
一、 概覽
1.1 結構圖
1.2 Service
RepositoryService | 管理流程定義 |
---|---|
RuntimeService | 執行管理,包括啟動、推進、刪除流程例項等操作 |
TaskService | 任務管理 |
HistoryService | 歷史管理(執行完的資料的管理) |
IdentityService | 組織機構管理 |
FormService | 一個可選服務,任務表單管理 |
ManagerService |
1.3 資料庫表格
表字首 | 型別 | 含義 |
---|---|---|
ACT_RE_* | repository | 包含了流程定義和流程靜態資源 (圖片,規則,等等) |
ACT_RU_* | runtime | 執行時的表,包含流程例項,任務,變數,非同步任務等執行中的資料,只在流程例項執行過程中儲存資料,在流程結束時刪除記錄, 這樣執行時表可以一直很小速度很快。 |
ACT_ID_* | identity | 包含身份資訊,比如使用者,組等 |
ACT_HI_* | history | 包含歷史資料,比如歷史流程例項, 變數,任務等 |
ACT_GE_* | general | 用於不同場景下,如存放資原始檔 |
1.4 Activiti資料表清單
表分類 | 表名 | 解釋 |
---|---|---|
一般資料 | ACT_GE_BYTEARRAY | 通用的流程定義和流程資源 |
一般資料 | ACT_GE_PROPERTY | 系統相關屬性 |
流程歷史記錄 | ACT_HI_ACTINST | 歷史的流程例項 |
流程歷史記錄 | ACT_HI_ATTACHMENT | 歷史的流程附件 |
流程歷史記錄 | ACT_HI_COMMENT | 歷史的說明性資訊 |
流程歷史記錄 | ACT_HI_DETAIL | 歷史的流程執行中的細節資訊 |
流程歷史記錄 | ACT_HI_IDENTITYLINK | 歷史的流程執行過程中使用者關係 |
流程歷史記錄 | ACT_HI_PROCINST | 歷史的流程例項 |
流程歷史記錄 | ACT_HI_TASKINST | 歷史的任務例項 |
流程歷史記錄 | ACT_HI_VARINST | 歷史的流程執行中的變數資訊 |
使用者使用者組表 | ACT_ID_GROUP | 身份資訊-組資訊 |
使用者使用者組表 | ACT_ID_INFO | 身份資訊-組資訊 |
使用者使用者組表 | ACT_ID_MEMBERSHIP | 身份資訊-使用者和組關係的中間表 |
使用者使用者組表 | ACT_ID_USER | 身份資訊-使用者資訊 |
流程定義表 | ACT_RE_DEPLOYMENT | 部署單元資訊 |
流程定義表 | ACT_RE_MODEL | 模型資訊 |
流程定義表 | ACT_RE_PROCDEF | 已部署的流程定義 |
執行例項表 | ACT_RU_EVENT_SUBSCR | 執行時事件 |
執行例項表 | ACT_RU_EXECUTION | 執行時流程執行例項 |
執行例項表 | ACT_RU_IDENTITYLINK | 執行時使用者關係資訊 |
執行例項表 | ACT_RU_JOB | 執行時作業 |
執行例項表 | ACT_RU_TASK | 執行時任務 |
執行例項表 | ACT_RU_VARIABLE | 執行時變數表 |
1.5 核心API
1.5.1 ProcessInstance
代表流程定義的執行例項。流程例項就表示一個流程從開始到結束的最大的流程分支,即一個流程中流程例項只有一個。
1.5.2 Execution
執行物件Execution,流程按照流程定義的規則執行一次的過程;
- 併發執行的流程, 匯流排路代表ProcessInstance,而分線路中每個活動代表Execution
- 一個流程中,執行物件併發執行的流程, 匯流排路代表ProcessInstance,而分線路中每個活動代表Execution
- 可以存在多個,但是流程例項ProcessInstance只能有一個
二、 Method & table
2.1 DeploymentBuilder.deploy()
Deployment deployment = processEngine.getRepositoryService()//
.createDeployment()
.addClasspathResource("diagrams/LeaveBill.bpmn")
.addClasspathResource("diagrams/LeaveBill.png")
.deploy();
複製程式碼
這一步在資料庫中將操作三張表:
- act_re_deployment(部署物件表)
存放流程定義的顯示名和部署時間,每部署一次增加一條記錄 - act_re_procdef(流程定義表)
存放流程定義的屬性資訊,部署每個新的流程定義都會在這張表中增加一條記錄。注意:當流程定義的key相同的情況下,使用的是版本升級
- act_ge_bytearray(資原始檔表)
儲存流程定義相關的部署資訊。即流程定義文件的存放地。每部署一次就會增加兩條記錄,一條是關於bpmn規則檔案的,一條是圖片的(如果部署時只指定了bpmn一個檔案,activiti會在部署時解析bpmn檔案內容自動生成流程圖)。兩個檔案不是很大,都是以二進位制形式儲存在資料庫中。
-
ACT_RE_PROCDEF
流程解析表,解析成功了,在該表儲存一條記錄。業務流程定義資料表ACT_RE_PROCDEF(act_re_procdef)
NAME 欄位名 欄位描述 ID_ 流程ID {processDefinitionKey}:{processDefinitionVersion}:{generated-id} REV_ 版本號 CATEGORY_ 流程名稱空間 流程定義的Namespace就是類別 NAME_ 流程名稱 該編號就是流程檔案process元素的name屬性值 KEY_ 流程定義ID 該編號就是流程檔案process元素的id屬性值 VERSION_ 流程版本號 由程式控制,新增即為1,修改後依次加1來完成的 DEPLOYMENT_ID_ 部署編號 部署表ID RESOURCE_NAME_ 流程bpmn檔名稱 DGRM_RESOURCE_NAME_ png流程圖片名稱 DESCRIPTION_ 描述資訊 描述 HAS_START_FORM_KEY_ start節點是否存在formKey 0否 1是 SUSPENSION_STATE_ 是否掛起 1啟用 2掛起 此表和ACT_RE_DEPLOYMENT是多對一的關係,即一個部署的bar包裡可能包含多個流程定義檔案,每個流程定義檔案都會有一條記錄在ACT_RE_PROCDEF表內,每個流程定義的資料,都會對於ACT_GE_BYTEARRAY表內的一個資原始檔和PNG圖片檔案。和ACT_GE_BYTEARRAY的關聯是通過程式用ACT_GE_BYTEARRAY.NAME與ACT_RE_PROCDEF.NAME_完成的, 在資料庫表結構中沒有體現
-
ACT_RE_DEPLOYMENT
用來儲存部署時需要持久化儲存下來的資訊是否主鍵 欄位名 欄位描述 ID_ 部署編號,自增長 NAME_ 部署包的名稱 CATEGORY_ 型別 VARCHAR(255) DEPLOY_TIME_ 部署時間 TIMESTAMP -
ACT_GE_BYTEARRAY
儲存所有二進位制資料 LeaveBill.bpmn和LeaveBill.png都是ResourceEntity,被新增入表中
ACT_GE_BYTEARRAY(act_ge_bytearray)
Name 欄位名 欄位描述 ID_ ID_ 主鍵ID,資原始檔編號,自增長 REV_ 版本號 INT(11) NAME_ 部署的檔名稱, DEPLOYMENT_ID_ 來自於父表ACT_RE_DEPLOYMENT的主鍵 BYTES_ 大文字型別,儲存文字位元組流 LONGBLOB GENERATED_ 是否是引擎生成 0為使用者生成,1為Activiti生成
2.2 RuntimeService().startProcessInstanceByKey()
當流程到達一個節點時,會在ACT_RU_EXECUTION表中產生1條資料,如果當前節點是使用者任務節點,這是會在ACT_RU_TASK表中新增一條記錄
-
ACT_RU_TASK(執行時任務資料表)
(執行中實時任務)代辦任務查詢表
ACT_RU_TASK(act_ru_task)
是否主鍵 欄位名 欄位描述 ID_ REV_ 版本號 INT(11) EXECUTION_ID_ 例項id(外來鍵EXECUTION_ID_) 執行例項ID ** PROC_INST_ID_** 流程例項ID(外來鍵PROC_INST_ID_) VARCHAR(64) PROC_DEF_ID_ 流程定義ID VARCHAR(64) NAME_ 任務名稱 節點定義名稱 PARENT_TASK_ID_ 父節任務ID 父節點例項ID DESCRIPTION_ 任務描述 節點定義描述 TASK_DEF_KEY_ 任務定義key 任務定義的ID OWNER_ 所屬人(老版) 擁有者(一般情況下為空,只有在委託時才有值) ASSIGNEE_ 代理人員(受讓人) 簽收人或委託人 DELEGATION_ 代理團 委託型別,DelegationState分為兩種:PENDING,RESOLVED。如無委託則為空VARCHAR(64) PRIORITY_ 優先權 INT(11) CREATE_TIME_ 建立時間 TIMESTAMP DUE_DATE_ 執行時間 耗時 SUSPENSION_STATE_ 暫停狀態 1代表啟用 2代表掛起 -
ACT_RU_EXECUTION(執行時流程執行例項)
核心,我的待辦任務查詢表
ACT_RU_EXECUTION(act_ru_execution)
是否主鍵 欄位名 欄位描述 ID_ ID_ REV_ 版本號 INT(11) PROC_INST_ID_ 流程例項編號 VARCHAR(64) BUSINESS_KEY_ 業務主鍵ID VARCHAR(255) PARENT_ID_ 父執行流程 父節點例項ID PROC_DEF_ID_ 流程定義Id VARCHAR(64) SUPER_EXEC_ VARCHAR(64) 64 ACT_ID_ 例項id 節點例項ID即ACT_HI_ACTINST中ID IS_ACTIVE_ 啟用狀態 是否存活 IS_CONCURRENT_ 併發狀態 是否為並行(true/false) IS_SCOPE_ TINYINT(4) IS_EVENT_SCOPE_ TINYINT(4) SUSPENSION_STATE_ 暫停狀態_ 掛起狀態 1啟用 2掛起 CACHED_ENT_STATE_ 快取結束狀態_ INT(11) -
ACT_RU_IDENTITYLINK(身份聯絡)
主要儲存當前節點參與者的資訊,任務參與者資料表。
ACT_RU_IDENTITYLINK(act_ru_identitylink)
是否主鍵 欄位名 欄位描述 ID_ ID_ REV_ 版本號 INT(11) GROUP_ID_ 使用者組ID VARCHAR(255) TYPE_ 使用者組型別 主要分為以下幾種:assignee、candidate、owner、starter、participant。即:受讓人,候選人,所有者、起動器、參與者 USER_ID_ 使用者ID VARCHAR(255) TASK_ID_ 任務Id VARCHAR(64) PROC_INST_ID_ 流程例項ID VARCHAR(64) PROC_DEF_ID_ 流程定義Id VARCHAR(64) -
ACT_HI_ACTINST(歷史節點表)
歷史活動資訊。這裡記錄流程流轉過的所有節點,與HI_TASKINST不同的是,taskinst只記錄usertask內容ACT_HI_ACTINST(act_hi_actinst)
是否主鍵 欄位名 欄位描述 ID_ ID_ PROC_DEF_ID_ 流程定義ID VARCHAR(64) PROC_INST_ID_ 流程例項ID VARCHAR(64) EXECUTION_ID_ 流程執行ID VARCHAR(64) ACT_ID_ 活動ID 節點定義ID TASK_ID_ 任務ID 任務例項ID 其他節點型別例項ID在這裡為空 CALL_PROC_INST_ID_ 請求流程例項ID 呼叫外部流程的流程例項ID' ACT_NAME_ 活動名稱 節點定義名稱 ACT_TYPE_ 活動型別 如startEvent、userTask ASSIGNEE_ 代理人員 節點簽收人 START_TIME_ 開始時間 DATETIME END_TIME_ 結束時間 DATETIME DURATION_ 時長,耗時 毫秒值
三、 教程
3.1 setVariable和setVariableLocal的區別
- setVariable
設定流程變數的時候,流程變數名稱相同的時候,後一次的值替換前一次的值,且TASK_ID的欄位不會存放任務ID的值 - setVariableLocal
設定流程變數的時候,針對當前活動的節點設定流程變數,如果一個流程中存在2個活動節點(分支),對每個活動節點都設定流程變數,即使流程變數的名稱相同,後一次的版本的值也不會替換前一次版本的值,它會使用不同的任務ID作為標識,存放2個流程變數值,而且可以看到TASK_ID的欄位會存放任務ID的值
3.2 排他閘道器
只會返回一條結果。當流程執行到排他閘道器時,流程引擎會自動檢索閘道器出口,從上到下檢索如果發現第一條決策結果為true或者沒有設定條件的(預設為成立),則流出。
使用流程變數,設定連線的條件,並按照連線的條件執行工作流,如果沒有條件符合的條件,則以預設的連線離開.需要設定流程變數,不設定時拋異常,不會走,預設閘道器
3.3 並行閘道器
如果同一個並行閘道器有多個進入和多個外出順序流, 它就同時具有分支和匯聚功能。 這時,閘道器會先匯聚所有進入的順序流,然後再切分成多個並行分支。
並行閘道器不會解析條件, 即使順序流中定義了條件,也會被忽略
3.4 接收活動receiveTask
在任務建立後,意味著流程會進入等待狀態, 直到引擎接收了一個特定的訊息, 這會觸發流程穿過接收任務繼續執行.
ReceiceTask任務,機器自動完成的任務,只會在act_ru_execution
表中產生一條資料
3.5 個人任務
設定任務辦理人
3.5.1 使用流程變數
3.5.2 使用類
通過processEngine.getTaskService().setAssignee(taskId, userId);
將個人任務從一個人分配給另一個人,會覆蓋監聽器設定的代辦人
3.6 組任務
- 直接指定辦理人 查詢組任務成員列表
List<IdentityLink> list = processEngine.getTaskService().getIdentityLinksForTask(taskId)
複製程式碼
act_ru_identitylink
:存放任務的辦理人,包括個人任務和組任務,表示正在執行的任務
act_hi_identitylink
:存放任務的辦理人,包括個人任務和組任務,表示歷史任務
區別在於:
如果是個人任務TYPE的型別表示participant(參與者)
如果是組任務TYPE的型別表示candidate(候選者)和participant(參與者)
-
使用流程變數
-
類
通過processEngine.getTaskService().claim (taskId, userId);
將組任務分配給個人任務,也叫認領任務,即指定某個人去辦理這個任務.此時不會校驗userId是否在候選人中,如果不在,則將userId加入到候選人列表,對應IdentityLink表格
領任務的時候,可以是組任務成員中的人,也可以不是組任務成員的人,此時通過Type的型別為participant來指定任務的辦理人
3.7 角色組
act_id_group
:角色組表
act_id_user
:使用者表
act_id_membership
:使用者角色表
在部署流程定義和啟動流程例項的中間,設定組任務的辦理人,向Activiti表中存放組和使用者的資訊
四、 Activiti實戰
4.1 任務
4.1.1 使用者任務
任務監聽
Create 建立任務,assignment分配任務,complete完成任務
Expression,delegateExpression,Alfresco script
activity:initiator=”xxx”
:可以把啟動流程例項的操作人以變數名稱”xxx”儲存到資料庫中,需要配合identityService.setAuthenticatedUserId(authenticatedUserId)
使用
4.1.2 指令碼任務
可以執行指令碼語言
複製程式碼
4.1.3 Service 任務
4.1.4 業務規則任務
可以和drools整合
4.1.5 郵件任務
在serviceTask的基礎上由activiti擴充套件而來,可以發郵件
4.1.6 Camel
在serviceTask的基礎上由activiti擴充套件而來,是用來解決訊息路由的框架
4.1.7 Manual task
不做任何處理,流程引擎無需關係如何處理它,activiti把手動任務當做一個空任務來處理,當到達此任務時由引擎自動完成並轉向下一個任務
4.1.8 Receive task
在任務建立後開始等待訊息的到來,直到被觸發才會完成任務,可以通過RuntimeService介面的signal()方法傳送訊號觸發接收任務
4.1.9 多例項
允許一個任務甚至子流程可以重複執行多次如一個申請由多人審批,可以選擇順序執行和並行執行 可以設定重複執行,設定完成條件
4.2 閘道器gateway
4.2.1 排他閘道器
如果多個線路的計算結果為true,則會執行第一個值為true的閘道器,若線路都沒有true,則丟擲異常
4.2.2 並行閘道器
並行閘道器彙集處,只有當所有進入的流程都進來了,才能往下走流程
4.2.3 包容閘道器inclusivegateway
融合了排他閘道器和並行閘道器的特性,既可以同時執行多條線路,又允許在閘道器上設定條件
4.2.4 事件閘道器
事件閘道器是專門為中間捕獲事件設定,允許設定多個輸出流指向多個不同的中間捕獲事件(最少兩個).在流程執行到事件閘道器後,流程處於”等待”狀態,中間捕獲事件需要依賴中間丟擲事件觸發才能更改等待狀態為活動狀態
4.3 子流程與呼叫活動
4.3.1 子流程
子流程可以包含流程規範的大部分模型
最常用的是把最通用的流程獨立成子流程,嵌入到各個流程當中
- 約束
- 只能且僅能包含一個空啟動事件
- 至少要有一個結束事件
- 在子流程中順序流不能直接設定輸出流到子流程之外的活動上,可以通過邊界事件代替
4.3.2 呼叫活動 call activiti
和子流程作用一致,但表現方式不同,可以使用一個呼叫活動取代嵌入子流程的活動,通過建立一個呼叫活動模型並制定外部流程的id方式作為主流程的一個子活動
4.3.3 事件子流程
和子流程類似,不同的是事件子流程不能直接啟動,而是被動地由其他的事件觸發啟動 可以由異常事件,訊號事件,訊息事件,定時器事件,補償事件等觸發
4.3.4 事務子流程
該子流程擁有事務性,ACID,回滾
4.4 邊界與中間事件
邊界事件是繫結在活動上的”捕獲型”事件,一旦觸發邊界事件,當前活動會被中斷然後按照邊界事件之後的輸出流執行
一個活動只能繫結一個邊界事件
部分邊界事件中可以設定cancelActivity屬性值,以控制是否取消執行輸出流指定的活動
4.4.1 定時器邊界事件
定時啟動事件:用於在指定的時間啟動一個新的流程 定時器邊界事件:附屬在一個非自動任務,呼叫活動,子流程上,在上游任務執行完成之後開始倒數計時準備觸發事件
4.4.2 異常邊界事件
用來捕獲嵌入子流程或呼叫活動丟擲的異常 異常丟擲之後被主流程的異常邊界事件捕獲,同時嵌入子流程或呼叫活動中的活動也被中斷執行 異常邊界事件可以直接在流程定義圖
<sequenceFlow id="flow-treasurerAudit" name="財務不同意" sourceRef="exclusivegateway-treasurerAudit" targetRef="errorendevent2">
複製程式碼
也可以直接丟擲異常
4.4.3 訊號邊界事件
訊號邊界事件可以捕獲流程執行中丟擲的訊號,可以附加在各種活動和子流程上
訊號丟擲事件是全域性的:訊號邊界事件不僅可以捕獲本流程的訊號,還可以捕獲到其他流程的訊號事件,如果定義了多個訊號邊界事件並監聽同一個訊號,則會同時觸發多個邊界事件
4.4.4 取消邊界事件
專門針對事務子流程所設計的,用來捕獲子流程中丟擲的取消事件,不能附加到其他活動上
- 一個事務主流程只允許附加一個取消邊界事件
- 如果事務子流程中巢狀了子流程,僅僅觸發已經完成了的子流程補償事件?
- 對於多例項的事務子流程,若其中一個例項觸發取消事件,則全部例項都會被觸發取消邊界事件
4.4.5 補償邊界事件
用於事務子流程中針對事務失敗後的業務邏輯進行補償 若補償邊界事件附加的活動室多例項的,當丟擲補償事件時,每一個例項都會觸發補償邊界事件
4.4.6 中間捕獲事件
根據事件不同的型別需要使用不同的方式才能繼續執行後續的輸出流的活動 中間捕獲事件必須連線一個輸入流和輸出流
- 定時器中間捕獲事件
- 訊號中間捕獲事件
用來捕獲丟擲的訊號事件,訊號id一致即可捕獲
廣播式傳播 - 訊息中間捕獲事件
定向一對一傳播,一次只能把一個訊息發給一個指定的流程例項
4.4.7 中間丟擲事件
中間丟擲事件需要有對應的捕獲事件接收才有意義
中間丟擲事件一般用在一個任務完成後需要傳送通知或執行其他系統任務的場景,工作流引擎會對丟擲的事件進行傳播
- 空中間丟擲事件 不執行流程功能,可以藉助activiti對大多數活動/事件新增的擴充套件功能使其更有意義,可以作為中間狀態/結果的處理器
- 訊號中間丟擲事件
可以同步也可以非同步
同步時訊號發出後等待訊號被捕獲處理完成後才能繼續往下執行流程,中間出錯則回滾 非同步時發出訊號後立即執行下一流程, 不會回滾
4.5 監聽器
4.5.1 執行監聽器
允許在執行流程中執行java程式碼
監聽型別:start,end,take
可以捕獲的事件:
- 流程例項啟動,結束
- 輸出流捕獲
- 活動啟動,結束
- 路由開始,結束
- 中間事件開始,結束
- 觸發開始事件,觸發結束事件
3種監聽器執行型別
- Class:實現介面
- Expression:表示式,類似EL
- DelegateExpression:可以以引數形式設定實現的的介面類
4.5.2 任務監聽器
只能應用於使用者任務
監聽型別
- Assignment:在任務被分配給某個辦理人之後觸發,在create之前
- Create:需要逐一處理任務的辦理人,候選人,候選組屬性
- complete:任務完成,執行時執行資料被刪除之前 順序: assignment-> create->complete
4.6 任務表單
表單屬性
流程變數是整個流程例項公用的,即使是表單上要求必填的屬性,在流程中已有值時就可以不填五、 定時作業
引擎在部署流程之後,引擎對部署的流程定義做一些初始化的工作,其中就包含對定時作業的註冊和對訊息事件的註冊
ACT_RU_JOB表的主要欄位說明
六、 訊息啟動事件
在部署流程之後引擎會在初始化中處理訊息事件,把訊息的型別註冊到資料act_ru_event_subscr中
在流程執行過程中遇到了訊息型別事件或通過API觸發訊息事件觸發該表讀取資料,並且根據訊息的屬性呼叫訊息處理器
processInstance = runtimeService.startProcessInstanceByMessage("啟動XXX流程");
流程會找到act_ru_event_subscr表中的EVENT_NAME匹配訊息名稱,找到就啟動
七、 結束事件
終止結束事件:終止整個流程
空結束事件:只結束一條輸出流的執行
在歷史任務例項中HistoricActivityInstance,有個HistoricActivityInstance.getDeleteReason()
,對應act_hi_taskinst表的DELETE_REASON_欄位
如果一個任務正常完成(通過complete方法),則DELETE_REASON_值為completed,如果任務是被刪除的,則刪除原因為deleted
比如在空結束事件沒有complete,而主流程就completed了,則子流程的記錄就為deleted
八、 訊息邊界事件
訊息邊界事件,訊號邊界事件與異常邊界事件會多出一個cancelActivity屬性,可取值為:
True:在邊界事件觸發後取消已註冊的訊息事件
False:在邊界事件觸發後仍然保留已註冊的事件,可以再次觸發
runtimeService.messageEventReceived(messageName, executionId); //觸發訊息邊界事件
複製程式碼
同理,觸發訊號事件runtimeService.signalEventReceived(signalName, executionId);
如果一個任務有附加的訊息邊界事件,當任務執行完成且邊界事件沒有被觸發時,那麼已經註冊的事件將在任務完成時被刪除
九、 任務
9.1 任務委託人與任務辦理人
委託人:owner_
辦理人:assignee_
//參與人:
taskService.addUserIdentityLink(taskId, userId, identityLinkType);
taskService.getIdentityLinksForTask(taskId);
//簽收
processEngine.getTaskService().claim(task.getId(), " user "); // 資料庫欄位owner_為user
//委派
processEngine.getTaskService().delegateTask(task.getId(), "henryyan"); // //資料庫欄位assignee _為henryyan
//被委派人完成任務
taskService.resolveTask(task.getId());
複製程式碼
最終Assignee:user1,owen:user1
owner是任務所有者只能是一個,assignee是任務確定的接收者,也只能是一個,candidate是可領取任務的人,那麼就會有很多,所以candidate單獨放在identitylink表中關聯task,而前兩個就直接在task表中標明即可
當呼叫taskService.getIdentityLinksForTask("task102");
時,這三種情況(兩個表)都要統計進去。
9.2 簽收與反簽收
簽收: taskService.claim(taskId, userId);
反簽收: taskService.claim(taskId, null); // 把已簽收的任務辦理人置空
9.3 候選人與候選人組
taskService.addUserIdentityLink(taskId, userId, identityLinkType)
identityLinkType有分成幾類人
設定認證使用者有什麼用?
9.4 子任務
一個任務可以拆分出多個任務交給不同的人處理
當主任務complete時,子任務也會預設完成,從ru表刪除進入hi表
Task task2 = taskService.newTask();
task2.setParentTaskId(task.getId());
task2.setAssignee("sub task");
taskService.saveTask(task2); //記錄到資料庫中
複製程式碼
雜記
- 通過父流程檢視子流程
List<Execution> processInstances = processEngine.getRuntimeService().createExecutionQuery().processInstanceId("13201").list();
複製程式碼