如上圖所示:activiti 5.22.0 版內建25張表,下面我將簡要分析下這些表的做用。 一、表分類淺析 activiti的表主要分爲如下幾類: 1)通用數據表(2個) act_ge_bytearray:二進制數據表,如流程定義、流程模板、流程圖的字節流文件; act_ge_property:屬性數據表(不經常使用);web
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:用戶信息表,對應節點選定辦理人或候選人信息;eclipse
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:運行時流程變量數據表,存儲運行中的流程各節點的變量信息;ide
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_*: 通用數據, 用於不一樣場景下,如存放資源文件。 二、流程定義與流程模板 activiti中的流程定義大體有如下2中方式生成:this
一、由流程定義文件(即bpmn/xml文件,一般可經過eclipse的插件繪製生成)直接部署生成流程定義; 二、由模板文件轉換部署而成; 詳細編碼請參考個人這篇文章:Activiti流程相關功能詳解 須要注意的是,流程定義在部署時,是根據流程定義的key來區分是不是同一種流程,所以key相同的流程定義相繼部署時,會生成該key對應的新版本的流程定義。
流程定義的key:zjjr-core-invite-chain:1:3597516 規則:流程的key:版本號:ID編碼
而工做流中的流程模板也可由2種方式造成:插件
一、新建模板信息,而後利用activiti的模板設計工具(web頁面)繪製後保存生成; 二、由流程定義文件(bpmn/xml)轉換生成; 詳情編碼請參考個人這篇文章:Activiti模板相關功能詳解設計
三、流程實例 啥叫流程實例?它與流程定義有何區別與聯繫呢?下面舉個栗子:
流程定義比如咱們的Java類,而流程實例就像由Java類生成的Java對象,所以,一個流程定義能夠生成多個流程實例;而工做流的運轉就是在流程實例的各個節點之間進行運轉。
四、流程運起色制 1)啓動流程 方法一:
ProcessInstance startProcessInstanceById(String processDefinitionId, String businessKey, Map<String, Object> var3);
方法二:
ProcessInstance submitStartFormData(String processDefinitionId, String businessKey, Map<String, String> properties)
通常用第一種,若是使用的是動態表單,選用第二種; 傳入參數均爲須要啓動的流程定義ID、業務主鍵ID、啓動參數;
【注】 一、啓動參數一般包含辦理的用戶ID、網關條件值(可選),以及節點中自定義的變量值。 二、啓動流程後,一般要往這幾張表寫入數據: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時流程運轉至該鏈接線! 五、流程配置 1)節點辦理人、候選人、候選組 能夠將工做流對接至自定義的數據庫用戶、角色信息表,具體方法請參考個人這篇文章:Activiti對接業務表實現自定義用戶和用戶組 對接成功後能夠改造流程設計器的選定用戶、用戶組界面,實現以下效果:
能夠直接點擊選擇節點的辦理人、候選人、候選組; 至此,我對工做流的一些常見知識作了初步總結,但願對讀者有幫助!