如上圖所示:activiti 5.22.0 版內建25張表,下面我將簡要分析下這些表的作用。
1、表分類淺析
activiti的表主要分為以下幾類:
1)通用數據表(2個)
act_ge_bytearray:二進制數據表,如流程定義、流程模板、流程圖的字節流文件;
act_ge_property:屬性數據表(不常用);
2)歷史表(8個,HistoryService接口操作的表)
act_hi_actinst:歷史節點表,存放流程實例運轉的各個節點信息(包含開始、結束等非任務節點);
act_hi_attachment:歷史附件表,存放歷史節點上傳的附件信息(不常用);
act_hi_comment:歷史意見表,可改造用于保存節點審批意見、備注;
act_hi_detail:歷史詳情表,存儲節點運轉的一些信息(不常用);
act_hi_identitylink:歷史流程人員表,存儲流程各節點候選、辦理人員信息,常用于查詢某人或部門的已辦任務;
act_hi_procinst:歷史流程實例表,存儲流程實例歷史數據(包含正在運行的流程實例);
act_hi_taskinst:歷史流程任務表,存儲歷史任務節點;
act_hi_varinst:流程歷史變量表,存儲流程歷史節點的變量信息;
3)用戶相關表(4個,IdentityService接口操作的表)
act_id_group:用戶組信息表,對應節點選定候選組信息;
act_id_info:用戶擴展信息表,存儲用戶擴展信息;
act_id_membership:用戶與用戶組關系表;
act_id_user:用戶信息表,對應節點選定辦理人或候選人信息;
4)流程定義、流程模板相關表(3個,RepositoryService接口操作的表)
act_re_deployment:部屬信息表,存儲流程定義、模板部署信息;
act_re_procdef:流程定義信息表,存儲流程定義相關描述信息,但其真正內容存儲在act_ge_bytearray表中,以字節形式存儲;
act_re_model:流程模板信息表,存儲流程模板相關描述信息,但其真正內容存儲在act_ge_bytearray表中,以字節形式存儲;
5)流程運行時表(6個,RuntimeService接口操作的表)
act_ru_task:運行時流程任務節點表,存儲運行中流程的任務節點信息,重要,常用于查詢人員或部門的待辦任務時使用;
act_ru_event_subscr:監聽信息表,不常用;
act_ru_execution:運行時流程執行實例表,記錄運行中流程運行的各個分支信息(當沒有子流程時,其數據與act_ru_task表數據是一一對應的);
act_ru_identitylink:運行時流程人員表,重要,常用于查詢人員或部門的待辦任務時使用;
act_ru_job:運行時定時任務數據表,存儲流程的定時任務信息;
act_ru_variable:運行時流程變量數據表,存儲運行中的流程各節點的變量信息;
6)其他(2個)
act_evt_log:事件日志表,不常用;
act_procdef_info:流程定義擴展表,不常用;
總結如下:
ACT_RE_: 'RE'表示repository。 這個前綴的表包含了流程定義和流程靜態資源 (圖片,規則,等等)。
ACT_RU_: 'RU'表示runtime。 這些運行時的表,包含流程實例,任務,變量,異步任務,等運行中的數據。 Activiti只在流程實例執行過程中保存這些數據, 在流程結束時就會刪除這些記錄。 這樣運行時表可以一直很小速度很快。
ACT_ID_: 'ID'表示identity。 這些表包含身份信息,比如用戶,組等等。
ACT_HI_: 'HI'表示history。 這些表包含歷史數據,比如歷史流程實例, 變量,任務等等。
ACT_GE_*: 通用數據, 用于不同場景下,如存放資源文件。
2、流程定義與流程模板
activiti中的流程定義大致有以下2中方式生成:
1、由流程定義文件(即bpmn/xml文件,通常可通過eclipse的插件繪制生成)直接部署生成流程定義;
2、由模板文件轉換部署而成;
詳細編碼請參考我的這篇文章:Activiti流程相關功能詳解
需要注意的是,流程定義在部署時,是根據流程定義的key來區分是否是同一種流程,因此key相同的流程定義相繼部署時,會生成該key對應的新版本的流程定義。
image.png
流程定義的key:zjjr-core-invite-chain:1:3597516
規則:流程的key:版本號:ID
而工作流中的流程模板也可由2種方式形成:
1、新建模板信息,然后利用activiti的模板設計工具(web頁面)繪制后保存生成;
2、由流程定義文件(bpmn/xml)轉換生成;
詳情編碼請參考我的這篇文章:Activiti模板相關功能詳解
3、流程實例
啥叫流程實例?它與流程定義有何區別與聯系呢?下面舉個栗子:
流程定義好比我們的Java類,而流程實例就像由Java類生成的Java對象,因此,一個流程定義可以生成多個流程實例;而工作流的運轉就是在流程實例的各個節點之間進行運轉。
4、流程運轉機制
1)啟動流程
方法一:
ProcessInstance startProcessInstanceById(String processDefinitionId, String businessKey, Map<String, Object> var3);
方法二:
ProcessInstance submitStartFormData(String processDefinitionId, String businessKey, Map<String, String> properties)
一般用第一種,如果使用的是動態表單,選用第二種;
傳入參數均為需要啟動的流程定義ID、業務主鍵ID、啟動參數;
【注】
1、啟動參數通常包含辦理的用戶ID、網關條件值(可選),以及節點中自定義的變量值。
2、啟動流程后,通常要往這幾張表寫入數據:act_ru_execution、act_ru_identitylink、act_ru_task、act_ru_variable、act_hi_actinst、act_hi_identitylink、act_hi_procinst、act_hi_taskinst、act_hi_varinst;
2)辦理流程
Activiti在辦理時默認有個認領任務的機制,比如某個任務節點同時配置了2個候選人辦理,則其中一人認領后,另一個候選人則不能辦理了;認領接口如下:
void claim(String taskId, String userId)
傳入任務ID和用戶ID即可認領(會校驗該任務是否已被認領,如果已被認領,則去校驗認領人和當前傳入的用戶是否一致,否則報錯),源碼如下:
protected Void execute(CommandContext commandContext, TaskEntity task) {
if (this.userId != null) {
if (task.getAssignee() != null) {
if (!task.getAssignee().equals(this.userId)) {
throw new ActivitiTaskAlreadyClaimedException(task.getId(), task.getAssignee());
}
} else {
task.setAssignee(this.userId, true, true);
}
} else {
task.setAssignee((String)null, true, true);
}
commandContext.getHistoryManager().recordTaskClaim(this.taskId);
return null;
}
當然也可以去掉認領這個步驟,即只要這個任務還沒被其中一個候選人辦理,那么無論哪個候選人都可以辦理,但一旦被其中一人辦理,這個任務就辦理結束,流程自動流轉到下一個節點;辦理時代碼如下:
// 辦理流程
taskService.setAssignee(task.getId(), in.getUserId().toString());
taskService.complete(task.getId(), in.getVariables());
setAssignee作用是將辦理該用流程的用戶信息記錄到act_ru_identitylink、act_hi_identitylink表中。
Activiti的運行表和歷史表在流程運行時是同步記錄數據的,當流程實例結束時,會刪除運行表種的數據,保留歷史表中的數據。
在有網關節點時,辦理任務需要額外傳入網關條件參數,指引工作流正確運轉到下一個節點(網關條件對應具體的連接線):
如上圖,在辦理該節點時,需傳入參數"wayType",值為1時流程運轉至該連接線!
5、流程配置
1)節點辦理人、候選人、候選組
可以將工作流對接至自定義的數據庫用戶、角色信息表,具體方法請參考我的這篇文章:Activiti對接業務表實現自定義用戶和用戶組
對接成功后可以改造流程設計器的選定用戶、用戶組界面,實現如下效果:
可以直接點擊選擇節點的辦理人、候選人、候選組;
至此,我對工作流的一些常見知識做了初步總結,希望對讀者有幫助!