導讀前幾天,阿粉給大家說了關于Activiti的使用,后臺就有好友私信阿粉說,這些表都不知道是什么意思,不行呀,看不明白呀,于是阿粉就打算在這次給大家講一下關于....
前幾天,阿粉給大家說了關于 Activiti 的使用,后臺就有好友私信阿粉說,這些表都不知道是什么意思,不行呀,看不明白呀,于是阿粉就打算在這次給大家講一下關于 Activiti 的這些表中的字段都是表示的什么意思。
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_procdef_info流程定義信息
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流程變量數據
阿粉把之前的表給大家都拿出來了,然后我們一一來看這些字段都是些什么意思。在說這個Activiti的表結構的意思的時候,我們肯定首先要知道 Activiti 的生命周期,生命周期要經過的步驟如下:
1.流程部署 ---> 2.啟動流程實例 --- > 3.執行流程對象(一個流程實例包含多個執行對象) ---> 4.完成整個流程
而我們要想了解這個流程,就得先從表結構開始了,我們來看看里表所有的表結構吧。
大家如果對表面結構沒有任何的興趣,那就往后滑,看后面的關于 Activiti 的流程的內容。
1.act_ge_bytearray 通用數據,二進制數據表保存流程定義圖片和xml、Serializable(序列化)的變量,即保存所有二進制數據,特別注意類路徑部署時候,不要把svn等隱藏文件或者其他與流程無關的文件也一起部署到該表中,會造成一些錯誤(可能導致流程定義無法刪除)。
字段說明
- ID_ : 主鍵ID,也是主鍵唯一索引
- REV_: Version(版本) 樂觀說
- NAME_: 部署的文件名稱,如:mail.bpmn、mail.png 、mail.bpmn20.xml
- DEPLOYMENT_ID_: 部署表ID
- BYTES_: 部署文件
- GENERATED_: 是否是引擎生成,0為用戶生成 1為Activity生成
在這里我們就要注意到 REV_ 這個樂觀鎖了,樂觀鎖每次在執行數據的修改操作時,都會帶上一個版本號,一旦版本號和數據的版本號一致就可以執行修改操作并對版本號執行 1操作,否則就執行失敗。因為每次操作的版本號都會隨之增加,所以不會出現ABA問題,因為版本號只會增加不會減少。除了version以外,還可以使用時間戳,因為時間戳天然具有順序遞增性。好像又開始偏題了,我們回歸正題,繼續看表。

2.act_ge_property 流程引擎數據表- NAME_: 屬性名稱,也是主鍵
- VALUE_: 資源
- REV_: 樂觀鎖
- next.dbid 當 Activiti 使用DbIdGenerator來生成主鍵時,用來表示Id塊的起始值;Id塊就是Activiti產生主鍵時,Id的取值范圍,從next.dbid ~ next.dbid idBlockSize-1 ,默認idBlockSize = 2500
- schema.version 表示數據結構版本
- schema.history 表示數據表結構的更新歷史
這里面的數據一般情況下是這幾個內容,標識的實際上相當于是 Activiti 的版本的一些相關的信息。
3.act_hi_actinst 歷史節點表這個表實際上就是表示的都是歷史活動信息,流程流轉過的所有節點的記錄都在這個表中,但是他是記錄的所有節點信息,而在 taskinst 只記錄 usertask 內容
- ID_: 主鍵ID
- PROC_DEF_ID_: 流程定義ID
- PROC_INST_ID_: 流程實例ID
- EXECUTION_ID_: 執行實例ID
- ACT_ID_: 節點定義ID
- TASK_ID_: 任務實例ID 其他節點類型實例ID在這里為空
- CALL_PROC_INST_ID_: 調用外部流程的流程實例ID
- ACT_NAME_: 節點定義名稱
- ACT_TYPE_: 節點類型,如startEvent、userTask
- ASSIGNEE_: 節點簽收人
- START_TIME_: 開始時間
- END_TIME_: 結束時間
- DURATION_: 耗時
4.act_hi_attachment 歷史附件表- ID_: 主鍵ID
- REV_: 樂觀鎖
- USER_ID_: 用戶ID
- NAME_: 附件名稱
- DESCRIPTION_: 描述信息
- TYPE_: 附件類型
- TASK_ID_: 節點實例ID
- PROC_INST_ID_: 流程實例ID
- URL_: 附件地址
- CONTENT_ID_: ACT_GE_BYTEARRAY的ID 二進制數據表的ID(對應關系)
5.act_hi_comment 歷史意見表- ID_: 主鍵ID
- TYPE_: 類型:event(事件)comment(意見)
- TIME_: 填寫時間
- USER_ID_: 填寫人用戶ID
- TASK_ID_: 節點實例ID
- PROC_INST_ID_: 流程實例ID
- ACTION_: 行為類型 AddUserLink、DeleteUserLink、AddGroupLink、DeleteGroupLink、AddComment、AddAttachment、DeleteAttachment.
- MESSAGE_: 用于存放流程產生的信息,比如審批意見
- FULL_MSG_: 附件地址
6.act_hi_detail 歷史詳情表- ID_: 主鍵ID
- TYPE_: 類型 FormProperty--表單 VariableUpdate--參數
- PROC_INST_ID_: 流程實例ID
- EXECUTION_ID_: 執行實例ID
- TASK_ID_: 任務實例ID
- ACT_INST_ID_: 節點實例ID,ACT_HI_ACTINST表的ID
- NAME_: 名稱
- VAR_TYPE_: 參數類型
- REV_: 樂觀鎖
- TIME_: 創建時間
- BYTEARRAY_ID_: ACT_GE_BYTEARRAY表的ID
- DOUBLE_: 存儲變量類型為Double
- LONG_: 存儲變量類型為long
- TEXT_: 存儲變量值類型為String
- TEXT2_: 此處存儲的是JPA持久化對象時,才會有值。此值為對象ID
業務表單中填寫的流程需要用到的變量,以及控制流程流轉的變量所有的詳細信息都會保存在這個歷史詳情表中。
7.act_hi_identitylink 歷史流程人員這個表其實就比較好了,因為當我們發起各種各樣流程的時候,我們需要的永遠都是保證數據從哪里來,已經誰發起的,追根溯源好找人呀。
- ID_: 主鍵ID
- GROUP_ID_: 組ID
- TYPE_: 類型 assignee、candidate、owner、starter 、participant
- USER_ID_: 用戶ID
- TASK_ID_: 節點實例ID
- PROC_INST_ID_: 流程實例ID
主要存儲歷史節點參與者的信息,就是把發起流程的,還有參與過這個流程的人員信息,全部都加到表中。
8.act_hi_procinst 歷史流程實例 (畫重點的表!)- ID_: 主鍵ID
- PROC_INST_ID_: 流程實例ID
- BUSINESS_KEY_: 業務主鍵,業務表單的ID
- PROC_DEF_ID_: 流程定義ID
- START_TIME_: 開始時間
- END_TIME_: 結束時間
- DURATION_: 耗時
- START_USER_ID_: 起草人的ID
- START_ACT_ID_: 開始節點ID
- END_ACT_ID_: 結束節點ID
- SUPER_PROCESS_INSTANCE_ID_: 父流程實例ID
- DELETE_REASON_: 刪除原因
9.act_hi_taskinst 歷史任務信息表 (畫重點的表!)- ID_: 主鍵ID
- PROC_DEF_ID_: 流程定義ID
- TASK_DEF_KEY_: 節點定義ID
- PROC_INST_ID_: 流程實例ID
- EXECUTION_ID_: 執行實例ID
- NAME_: 名稱
- PARENT_TASK_ID_: 父節點實例ID
- DESCRIPTION_: 描述
- OWNER_: 簽收人(默認為空,只有在委托時才有值)任務的擁有者
- ASSIGNEE_: 簽收人或被委托
- START_TIME_: 開始時間
- CLAIM_TIME_: 提醒時間
- END_TIME_: 結束時間
- DURATION_: 耗時
- DELETE_REASON_: 刪除原因(completed,deleted)
- PRIORITY_: 優先級別
- DUE_DATE_: 過期時間,表明任務應在多長時間內完成
- FORM_KEY_: 節點定義的formkey,desinger節點定義的form_key屬性
10.act_hi_varinst 歷史變量表- ID_: 主鍵ID
- PROC_INST_ID_: 流程實例ID
- EXECUTION_ID_: 執行實例ID
- TASK_ID_: 任務實例ID
- NAME_: 名稱
- VAR_TYPE_: 參數類型
- REV_: 樂觀鎖
- BYTEARRAY_ID_: ACT_GE_BYTEARRAY表的主鍵
- DOUBLE_: 存儲DoubleType類型的數據
- LONG_: 存儲LongType類型的數據
- TEXT_: 存儲變量值類型為String,如此處存儲持久化對象時,值jpa對象的class
- TEXT2_: 此處存儲的是JPA持久化對象時,才會有值。此值為對象ID
11.act_id_group 用戶信息組- ID_: 主鍵ID
- REV_: 樂觀鎖
- NAME_: 用戶組名稱
- TYPE_: 用戶組類型
12.act_id_info 用戶信息詳情表- ID_: 主鍵ID
- REV_: 樂觀鎖
- USER_ID_: 用戶ID
- TYPE_: 類型
- KEY_: formINPut名稱
- VALUE_: 值
- PASSWORD_: 密碼
- PARENT_ID_: 父節點
用戶信息詳情表,這個表好像有點雞肋,目前說是還沒有用到,
13.act_id_membership 用戶與分組對應信息表總得來說,這個表是真的簡單,因為只是表示用戶和組之間的對應關系,和很多硬件方面的內容好像很類似,就幾個字段。
- USER_ID: 用戶ID
- GROUP_ID: 用戶組ID
14.act_id_user 用戶信息表- ID_: 主鍵ID
- REV_: 樂觀鎖
- FIRST_: 用戶姓
- LAST_: 用戶名
- EMAIL_: 郵箱
- PWD_: 密碼
- PICTURE_ID_: 頭像Id
15.act_procdef_info 流程定義信息表16.act_re_deployment 部署信息表- ID_: 主鍵ID
- NAME_: 部署文件名
- CATEGORY_: 分類類別
- DEPLOY_TIME_: 部署時間
這個表主要就是在部署流程定義時需要被持久化保存下來的信息。
17.act_re_model 流程設計模型表- ID_: 主鍵ID
- REV_: 樂觀鎖
- NAME_: 名稱
- KEY_:模型的關鍵字 流程引擎用到。比如:FTOA_SWGL
- CATEGORY_: 類型,用戶自己對流程模型的分類。
- CREATE_TIME_: 創建時間
- LAST_UPDATE_TIME_: 最后的修改時間
- VERSION_: 版本
- META_INFO_: 以json格式保存流程定義的信息
- DEPLOYMENT_ID_: 部署ID
- EDITOR_SOURCE_VALUE_ID_: 編輯源值ID
- EDITOR_SOURCE_EXTRA_VALUE_ID_: 編輯源額外值ID(外鍵ACT_GE_BYTEARRAY )
18.act_re_procdef 流程定義數據表這個表示業務流程定義數據表,對應關系和 act_re_deployment 是多對一的關系。
- ID_: 主鍵ID
- REV_: 樂觀鎖
- CATEGORY_: 流程定義的Namespace就是類別,該編號就是流程文件targetNamespace的屬性值
- NAME_: 流程名稱,該編號就是流程文件process元素的name屬性值
- KEY_: 流程編號,該編號就是流程文件process元素的id屬性值
- VERSION_: 流程版本號,由程序控制,新增即為1,修改后依次加1來完成的
- DEPLOYMENT_ID_: 部署表ID
- RESOURCE_NAME_: 流程bpmn文件名稱
- DGRM_RESOURCE_NAME_: png流程圖片名稱
- DESCRIPTION_: 描述信息
- HAS_START_FORM_KEY_: 是否從key啟動,start節點是否存在formKey 0否 1是
- SUSPENSION_STATE_: 是否掛起,1激活 2掛起
19.act_ru_event_subscr 信息監聽表- ID_: 主鍵ID
- REV_: 樂觀鎖
- EVENT_TYPE_: 事件類型
- EVENT_NAME_: 事件名稱
- EXECUTION_ID_: 執行實例ID
- PROC_INST_ID_: 流程實例ID
- ACTIVITY_ID_: 活動實例ID
- CONFIGURATION_: 配置信息
- CREATED_: 創建時間
20.act_ru_execution 運行時流程執行數據表這個表實際上就是很多 OA 中會出現的比如說,待辦信息的展示。
- ID_: 主鍵ID
- REV_: 樂觀鎖
- PROC_INST_ID_: 流程實例ID
- BUSINESS_KEY_: 業務主鍵ID
- PARENT_ID_: 父節點實例ID
- PROC_DEF_ID_: 流程定義ID
- SUPER_EXEC_:
- ACT_ID_: 節點實例ID即 ACT_HI_ACTINST 中ID
- IS_ACTIVE_: 激活狀態,是否存活
- IS_CONCURRENT_: 是否為并行(true/false)
- IS_SCOPE_: 范圍定義
- IS_EVENT_SCOPE_: 事件范圍
- SUSPENSION_STATE_: 掛起狀態 1激活 2掛起
- CACHED_ENT_STATE_: 緩存結束狀態
21.act_ru_identitylink 運行時節點人員數據信息表任務參與者數據表。主要存儲當前節點參與者的信息。
- ID_: 主鍵ID
- REV_: 樂觀鎖
- GROUP_ID_: 分組ID
- TYPE_: 用戶組類型 主要分為以下幾種:assignee、candidate、owner、starter、participant。即:受讓人,候選人,所有者、起動器、參與者
- USER_ID_: 用戶ID
- TASK_ID_: 任務Id
- PROC_INST_ID_: 流程實例ID
- PROC_DEF_ID_: 流程定義Id
22.act_ru_job 定時任務數據表- ID_: 主鍵ID
- REV_: 樂觀鎖
- TYPE_: 類型
- LOCK_EXP_TIME_: 鎖定釋放時間
- LOCK_OWNER_: 掛起者
- EXCLUSIVE_:
- EXECUTION_ID_: 執行實例ID
- PROCESS_INSTANCE_ID_: 流程實例ID
- PROC_DEF_ID_: 流程定義ID
- RETRIES_:
- EXCEPTION_STACK_ID_: 異常信息ID
- EXCEPTION_MSG_: 異常信息
- DUEDATE_: 到期時間
- REPEAT_: 重復
- HANDLER_TYPE_: 處理類型
- HANDLER_CFG_: 標識
23.act_ru_task 運行時任務節點表- ID_: 主鍵ID
- REV_: 樂觀鎖
- EXECUTION_ID_: 執行實例ID
- PROC_INST_ID_: 流程實例ID
- PROC_DEF_ID_: 流程定義ID
- NAME_: 節點定義名稱
- PARENT_TASK_ID_: 父節點實例ID
- DESCRIPTION_: 節點定義描述
- TASK_DEF_KEY_: 任務定義的ID
- OWNER_: 擁有者(一般情況下為空,只有在委托時才有值) 實際簽收人
- ASSIGNEE_: 簽收人或委托人
- DELEGATION_: 委托類型
- PRIORITY_: 優先級別,默認為:50
- CREATE_TIME_: 創建時間
- DUE_DATE_: 耗時
- SUSPENSION_STATE_: 是否掛起,1代表激活 2代表掛起
24.act_ru_variable 流程變量數據表- ID_: 主鍵ID
- REV_: 樂觀鎖
- TYPE_: 編碼類型
- NAME_: 變量名稱
- EXECUTION_ID_: 執行實例ID
- PROC_INST_ID_: 流程實例ID
- TASK_ID_: 節點實例ID(Local)
- BYTEARRAY_ID_:ACT_GE_BYTEARRAY的ID
- DOUBLE_: 存儲變量類型為Double
- LONG_: 存儲變量類型為long
- TEXT_: 存儲變量值類型為String 如此處存儲持久化對象時,值jpa對象的class
- TEXT2_: 此處存儲的是JPA持久化對象時,才會有值。此值為對象ID
Activiti生命周期1.流程部署 ---> 2.啟動流程實例 --- > 3.執行流程對象(一個流程實例包含多執行對象) ---> 4.完成整個流程

上圖是個請假流程圖,我們按照這個來整點代碼來安排一下這個工作請假審批流。
- 畫個圖,發布流程,進行流程部署
rocessEngine processEngine = ProcessEngines.getDefaultProcessEngine();RepositoryService repositoryService = processEngine.getRepositoryService();repositoryService.createDeployment() .addClasspathResource("activity.cfg.xml") .deploy();Log.info("Number of process definitions: " repositoryService.createProcessDefinitionQuery().count());
- 啟動一個流程實例
Map<String, Object> variables = new HashMap<String, Object>(); variables.put("employeeName", "Kermit"); variables.put("numberOfDays", new Integer(4)); variables.put("vacationMotivation", "Im really tired!"); RuntimeService runtimeService = processEngine.getRuntimeService(); ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("vacationRequest", variables); Log.info("Number of process instances: " runtimeService.createProcessInstanceQuery().count());
- 執行流程對象
TaskService taskService = processEngine.getTaskService();List<Task> tasks = taskService.createTaskQuery().taskCandidateGroup("management").list();for (Task task : tasks) { Log.info("Task available: " task.getName());}
上面代碼中的 tasks 實際上可以說是一個任務列表,展示了所有必須由整個用戶處理的任務
- 完成任務
Task task = tasks.get(0);Map<String, Object> taskVariables = new HashMap<String, Object>();taskVariables.put("vacationApproved", "false");taskVariables.put("managerMotivation", "We have a tight deadline!");taskService.complete(task.getId(), taskVariables);
對Activiti來說,就是需要complete任務,這個時候,實際上一個簡單的請假流程就已經完成了,這時候,流程實例就會進入到下一個環節中。
而在這中間,我們可以設置一下把請假流程掛起,掛起的時候,就不能創建新流程了,不然就會出現異常,
repositoryService.suspendProcessDefinitionByKey("vacationRequest");try { runtimeService.startProcessInstanceByKey("vacationRequest");} catch (ActivitiException e) { e.printStackTrace();}
我們通過 RepositoryService 掛起了流程,這個時候,流程不能繼續執行,也不會執行異步操作,當我們需要激活這個流程的時候,我們就需要調用:
runtimeService.activateProcessInstanceXXX 方法來對流程進行激活了。
Activiti 的生命周期,就是這么簡單,你學會了么?