《Activiti實戰》筆記java
RepositoryService | 管理流程定義 |
---|---|
RuntimeService | 執行管理,包括啓動、推動、刪除流程實例等操做 |
TaskService | 任務管理 |
HistoryService | 歷史管理(執行完的數據的管理) |
IdentityService | 組織機構管理 |
FormService | 一個可選服務,任務表單管理 |
ManagerService |
表前綴 | 類型 | 含義 |
---|---|---|
ACT_RE_* | repository | 包含了流程定義和流程靜態資源 (圖片,規則,等等) |
ACT_RU_* | runtime | 運行時的表,包含流程實例,任務,變量,異步任務等運行中的數據,只在流程實例執行過程當中保存數據,在流程結束時刪除記錄, 這樣運行時表能夠一直很小速度很快。 |
ACT_ID_* | identity | 包含身份信息,好比用戶,組等 |
ACT_HI_* | history | 包含歷史數據,好比歷史流程實例, 變量,任務等 |
ACT_GE_* | general | 用於不一樣場景下,如存放資源文件 |
表分類 | 表名 | 解釋 |
---|---|---|
通常數據 | 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 | 運行時變量表 |
表明流程定義的執行實例。流程實例就表示一個流程從開始到結束的最大的流程分支,即一個流程中流程實例只有一個。數據庫
執行對象Execution,流程按照流程定義的規則執行一次的過程;緩存
Deployment deployment = processEngine.getRepositoryService()//
.createDeployment()
.addClasspathResource("diagrams/LeaveBill.bpmn")
.addClasspathResource("diagrams/LeaveBill.png")
.deploy();
複製代碼
這一步在數據庫中將操做三張表:併發
注意:當流程定義的key相同的狀況下,使用的是版本升級框架
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_完成的, 在數據庫表結構中沒有體現ide
ACT_RE_DEPLOYMENT
用來存儲部署時須要持久化保存下來的信息ui
是否主鍵 | 字段名 | 字段描述 |
---|---|---|
ID_ | 部署編號,自增加 | |
NAME_ | 部署包的名稱 | |
CATEGORY_ | 類型 | VARCHAR(255) |
DEPLOY_TIME_ | 部署時間 | TIMESTAMP |
ACT_GE_BYTEARRAY
保存全部二進制數據 LeaveBill.bpmn和LeaveBill.png都是ResourceEntity,被添加入表中
ACT_GE_BYTEARRAY(act_ge_bytearray)
spa
Name | 字段名 | 字段描述 |
---|---|---|
ID_ | ID_ | 主鍵ID,資源文件編號,自增加 |
REV_ | 版本號 | INT(11) |
NAME_ | 部署的文件名稱, | |
DEPLOYMENT_ID_ | 來自於父表ACT_RE_DEPLOYMENT的主鍵 | |
BYTES_ | 大文本類型,存儲文本字節流 | LONGBLOB |
GENERATED_ | 是不是引擎生成 | 0爲用戶生成,1爲Activiti生成 |
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_ | 時長,耗時 | 毫秒值 |
只會返回一條結果。當流程執行到排他網關時,流程引擎會自動檢索網關出口,從上到下檢索若是發現第一條決策結果爲true或者沒有設置條件的(默認爲成立),則流出。
使用流程變量,設置連線的條件,並按照連線的條件執行工做流,若是沒有條件符合的條件,則以默認的連線離開.須要設置流程變量,不設置時拋異常,不會走,默認網關
若是同一個並行網關有多個進入和多個外出順序流, 它就同時具備分支和匯聚功能。 這時,網關會先匯聚全部進入的順序流,而後再切分紅多個並行分支。
並行網關不會解析條件, 即便順序流中定義了條件,也會被忽略
在任務建立後,意味着流程會進入等待狀態, 直到引擎接收了一個特定的消息, 這會觸發流程穿過接收任務繼續執行.
ReceiceTask任務,機器自動完成的任務,只會在act_ru_execution
表中產生一條數據
設置任務辦理人
processEngine.getTaskService().setAssignee(taskId, userId);
將我的任務從一我的分配給另外一我的,會覆蓋監聽器設置的代辦人
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表格act_id_group
:角色組表
act_id_user
:用戶表
act_id_membership
:用戶角色表
在部署流程定義和啓動流程實例的中間,設置組任務的辦理人,向Activiti表中存放組和用戶的信息
任務監聽
Create 建立任務,assignment分配任務,complete完成任務
Expression,delegateExpression,Alfresco script
activity:initiator=」xxx」
:能夠把啓動流程實例的操做人以變量名稱」xxx」保存到數據庫中,須要配合identityService.setAuthenticatedUserId(authenticatedUserId)
使用
能夠運行腳本語言
複製代碼
能夠和drools整合
在serviceTask的基礎上由activiti擴展而來,能夠發郵件
在serviceTask的基礎上由activiti擴展而來,是用來解決消息路由的框架
不作任何處理,流程引擎無需關係如何處理它,activiti把手動任務當作一個空任務來處理,當到達此任務時由引擎自動完成並轉向下一個任務
在任務建立後開始等待消息的到來,直到被觸發纔會完成任務,能夠經過RuntimeService接口的signal()方法發送信號觸發接收任務
容許一個任務甚至子流程能夠重複執行屢次如一個申請由多人審批,能夠選擇順序執行和並行執行 能夠設置重複執行,設置完成條件
若是多個線路的計算結果爲true,則會執行第一個值爲true的網關,若線路都沒有true,則拋出異常
並行網關聚集處,只有當全部進入的流程都進來了,才能往下走流程
融合了排他網關和並行網關的特性,既能夠同時執行多條線路,又容許在網關上設置條件
事件網關是專門爲中間捕獲事件設置,容許設置多個輸出流指向多個不一樣的中間捕獲事件(最少兩個).在流程執行到事件網關後,流程處於」等待」狀態,中間捕獲事件須要依賴中間拋出事件觸發才能更改等待狀態爲活動狀態
子流程能夠包含流程規範的大部分模型
最經常使用的是把最通用的流程獨立成子流程,嵌入到各個流程當中
和子流程做用一致,但表現方式不一樣,可使用一個調用活動取代嵌入子流程的活動,經過建立一個調用活動模型並制定外部流程的id方式做爲主流程的一個子活動
和子流程相似,不一樣的是事件子流程不能直接啓動,而是被動地由其餘的事件觸發啓動 能夠由異常事件,信號事件,消息事件,定時器事件,補償事件等觸發
該子流程擁有事務性,ACID,回滾
邊界事件是綁定在活動上的」捕獲型」事件,一旦觸發邊界事件,當前活動會被中斷而後按照邊界事件以後的輸出流執行
一個活動只能綁定一個邊界事件
部分邊界事件中能夠設置cancelActivity屬性值,以控制是否取消執行輸出流指定的活動
定時啓動事件:用於在指定的時間啓動一個新的流程 定時器邊界事件:附屬在一個非自動任務,調用活動,子流程上,在上游任務執行完成以後開始倒計時準備觸發事件
用來捕獲嵌入子流程或調用活動拋出的異常 異常拋出以後被主流程的異常邊界事件捕獲,同時嵌入子流程或調用活動中的活動也被中斷執行 異常邊界事件能夠直接在流程定義圖
<sequenceFlow id="flow-treasurerAudit" name="財務不一樣意" sourceRef="exclusivegateway-treasurerAudit" targetRef="errorendevent2">
複製代碼
也能夠直接拋出異常
信號邊界事件能夠捕獲流程執行中拋出的信號,能夠附加在各類活動和子流程上
信號拋出事件是全局的:信號邊界事件不只能夠捕獲本流程的信號,還能夠捕獲到其餘流程的信號事件,若是定義了多個信號邊界事件並監聽同一個信號,則會同時觸發多個邊界事件
專門針對事務子流程所設計的,用來捕獲子流程中拋出的取消事件,不能附加到其餘活動上
用於事務子流程中針對事務失敗後的業務邏輯進行補償 若補償邊界事件附加的活動室多實例的,當拋出補償事件時,每個實例都會觸發補償邊界事件
根據事件不一樣的類型須要使用不一樣的方式才能繼續執行後續的輸出流的活動 中間捕獲事件必須鏈接一個輸入流和輸出流
中間拋出事件須要有對應的捕獲事件接收纔有意義
中間拋出事件通常用在一個任務完成後須要發送通知或執行其餘系統任務的場景,工做流引擎會對拋出的事件進行傳播
容許在執行流程中執行java代碼
監聽類型:start,end,take
能夠捕獲的事件:
3種監聽器執行類型
只能應用於用戶任務
監聽類型
表單屬性
流程變量是整個流程實例公用的,即便是表單上要求必填的屬性,在流程中已有值時就能夠不填引擎在部署流程以後,引擎對部署的流程定義作一些初始化的工做,其中就包含對定時做業的註冊和對消息事件的註冊
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);
若是一個任務有附加的消息邊界事件,當任務執行完成且邊界事件沒有被觸發時,那麼已經註冊的事件將在任務完成時被刪除
委託人: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");
時,這三種狀況(兩個表)都要統計進去。
簽收: taskService.claim(taskId, userId);
反簽收: taskService.claim(taskId, null); // 把已簽收的任務辦理人置空
taskService.addUserIdentityLink(taskId, userId, identityLinkType)
identityLinkType有分紅幾類人
設置認證用戶有什麼用?
一個任務能夠拆分出多個任務交給不一樣的人處理
當主任務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();
複製代碼