Activiti 是一個針對企業用戶、開發人員 、系統管理員的輕量級工作流業務管理平臺(Business Process Management, 簡稱BPM),其核心是使用 Java 開發的快速 、 穩定的 BPMN2.0 流程引擎 。Activiti是開源的,並基於Apache許可發行。Activiti可以在任何Java應用程序、服務器、集羣或雲中運行,它可以與 Spring 完美集成。
Activiti Github地址:https://github.com/Activiti/Activiti
工作流的生命週期
在介紹Activiti的表結構之前,非常有必要先對工作流的生命週期有一定的瞭解。因爲在對業務流程進行設計與運行的過程中,都在體現着工作流的生命週期,並且,Activiti的表結構中有一部分也是基於生命週期設計的。
一個完整的工作流生命週期會經過以下五個階段:定義、發佈、執行、監控、優化。
- 定義:業務需求人員收集業務需求,然後交由開發人員加工轉化爲計算機可以識別的流程定義
- 發佈:開發人員打包各種資源,然後在系統管理平臺中發佈流程定義(包括流程定義文件 、自定義表單 、 任務監聽類等資源 )
- 執行:流程引擎按照事先定義好的流程,以任務驅動的方式予以執行
- 監控:監控依賴執行階段 。業務人員在辦理任務的同時,引擎會收集每個任務的辦理結果,然後根據結果做出處理
- 優化:對整個流程的運行結果進行分析,在此基礎上進一步改進,並再次開始一個新的週期
Activiti表結構
Activiti(6.0.0)總共包含28張數據表,所有的表名默認以"ACT_"開頭
Activiti數據表按類別可以分爲五大類:
數據表分類 | 描述 |
---|---|
ACT_GE_* | 通用數據表(2張) |
ACT_HI_* | 歷史數據表(8張) |
ACT_ID_* | 身份數據表(4張) |
ACT_RE_* | 倉庫數據表(3張) |
ACT_RU_* | 運行時數據表(9張) |
上述總共26張表,剩餘兩張表:
數據表分類 | 描述 |
---|---|
ACT_EVT_LOG | 事件日誌數據表 |
ACT_PROCDEF_INFO | 流程定義動態改變信息表 |
一、通用數據表
數據表分類 | 描述 |
---|---|
ACT_GE_PROPERTY | 屬性表 |
ACT_GE_BYTEARRAY | 資源表 |
1. ACT_GE_PROPERTY
該表爲屬性表,保存流程引擎的KV鍵值屬性,用於存儲流程引擎的級別信息,包括數據庫歷史操作和數據庫版本等,在啓動流程引擎時創建。上圖中底下的三條記錄是創建數據庫時自動插入的,插入語句寫在建表的 sql 語句中。
該表的字段說明:
cfg.execution-related-entities-cout
:流程執行相關的實例計數器功能,默認是關閉的,開啓後在 ACT_RU_EXECUTION 表的後幾個帶有 *COUNT 的字段會顯示計數信息,可以通過配置 activiti.cfg.xml 添加以下語句來開啓配置。
<property name="enableExecutionRelationshipCounts" value="true"/>
next.dbid
:記錄數據庫的主鍵ID,每對數據庫進行一次修改(如部署流程定義文件)該值就會發生變化:next.dbid值+步長,默認步長idBlockSize = 2500。其中的 VALUE_ 和 REV_ 初始值爲1,上圖中表示我總共進行了59次修改:1+59*2500=147501schema.history
:表示對Activiti整個數據庫的操作歷史,這裏是 create,表示目前僅做過創建表的操作,若整個數據庫是從5.x的版本進行升級的,那麼該值就會是update的值,同時 REV_ 的值會+1schema.history
:表示Activiti的數據庫的版本
通過 ManagementService 的 getProperties 方法可以獲取屬性值
/**
* 獲取屬性表中的屬性信息
*/
public static void getProperties(){
ManagementService managementService = processEngine.getManagementService();
Map<String, String> properties = managementService.getProperties();
for(String str: properties.keySet()){
logger.info(str + ":" + properties.get(str));
}
}
2. ACT_GE_BYTEARRAY
該表爲資源表,用於保存Activiti運行過程中的資源(如:流程定義文件bpmn和對應的png圖片,需要持久化保存的序列化對象,手工添加的資源信息)
關鍵字段說明:
REV_
:該字段爲版本號,本質是一個樂觀鎖,若我們對資源文件進行過修改操作,該值+1;DEPLOYMENT_ID_
:流程資源文件對應的流程部署ID;BYTES_
:流程定義文件一般都是以大對象進行保存,類型爲BLOB;點擊該字段的值,若爲PNG的圖片信息,我們將顯示方式由文本改爲圖片,會在下方顯示流程圖片;GENERATED_
:表示該資源是手動添加的還是自動生成的,0爲用戶添加,1爲引擎生成;若我們在部署資源文件的時候只添加了bpmn文件,流程引擎會爲我們自動生成 png的圖片
除了以資源文件添加的方式,也可以通過手工方式添加資源信息,我們以插入一個字符串爲例:
public static void testByteArrayInsert(){
ManagementService managementService = processEngine.getManagementService();
managementService.executeCommand(new Command<Object>() {
@Override
public Object execute(CommandContext commandContext) {
ByteArrayEntityImpl entity = new ByteArrayEntityImpl();
entity.setId("10004");
entity.setName("testSource");
entity.setBytes("testSource".getBytes());
commandContext.getByteArrayEntityManager().insert(entity);
// commandContext.getByteArrayEntityManager().deleteByteArrayById("10004");
return null;
}
});
}
二、流程定義存儲表
數據表分類 | 描述 |
---|---|
ACT_RE_DEPLOYMENT | 流程部署表 |
ACT_RE_PROCDEF | 流程定義表 |
ACT_RE_MODEL | 流程模型表 |
1. ACT_RE_DEPLOYMENT
該表爲流程部署表,用於記錄流程的部署情況(流程部署的名稱、類別、key標識、租戶ID、部署時間等)
關鍵字段說明:
CATEGORY_
:用於標記該流程所屬的流程類型KEY_
:流程標識TENANT_ID_
:該流程所屬的租戶,不同租戶對應的流程爲不同的版本
想要對上表中的字段有更清晰地認識,可以操縱下面這段代碼:
/**
* 部署流程定義文件
*/
private static void deploy() {
Deployment deployment = processEngine.getRepositoryService()
.createDeployment()
.addClasspathResource("diagrams/MyProcess.bpmn")
.addClasspathResource("diagrams/MyProcess.png")
.name("FirstApprove流程")
.category("測試流程")
.tenantId("A")
.key("simpleForm")
.activateProcessDefinitionsOn(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS")
.parse("2020-04-15 09:46:00:545"))
.deploy();
System.out.println("流程部署ID:"+deployment.getId());
System.out.println("流程部署Name:"+deployment.getName());
}
1)當我們部署了一個流程的時候,默認是激活狀態的,若我們設置了 activateProcessDefinitionsOn則表示流程未激活,需要以手工方式進行激活。2)上述代碼執行後,相應的有三張表發生了變化,ACT_GE_BYTEARRAY 表中增加了兩條資源記錄,ACT_RE_DEPLOYMENT 表中增加了一條部署記錄,ACT_RE_PROCDEF 表中增加了一條流程定義信息記錄。
2. ACT_RE_PROCDEF
該表爲流程定義信息表,用於記錄部署的流程定義信息
關鍵字段說明:
-
REV_
:表示的是樂觀鎖(對流程的修改操作後,該字段值加1,如對流程定義的暫定和激活操作)
-
CATEGORY_
:流程定義類別,表示的是流程定義文件(xml格式)中的targetNamespace的屬性值
-
NAME_
:流程定義文件的 name 屬性值 -
KEY_
:流程定義文件的ID值,我們一般以 KEY 值作爲流程定義的唯一表標識,並且通過 KEY 值來啓動流程定義文件 -
VERSION_
:流程定義的版本號,只要流程定義的ID值不變,每進行一次流程發佈,該值加1 -
DESCRIPTION
和HAS_START_FORM_KEY_
對應流程定義文件:
-
SUSPENSION_STATE_
:流程暫停狀態,1爲激活狀態,2爲暫停掛起狀態。
3. ACT_RE_MODEL
模型信息表(用於WEB設計器),在5.x的版本用於WEB設計器,一些json數據會存在此表中,這裏不做過多說明。
三、運行時數據表
數據表分類 | 描述 |
---|---|
ACT_RU_EXECUTION | 運行時流程實例執行表 |
ACT_RU_TASK | 運行時任務表 |
ACT_RU_IDENTITYLINK | 運行時參與者信息表 |
ACT_RU_VARIABLE | 運行時變量表 |
ACT_RU_EVENT_SUBSCR | 運行時事件訂閱表 |
ACT_RU_JOB | 運行時作業表 |
ACT_RU_TIMER_JOB | 運行時定時器表 |
ACT_RU_SUSPENDED_JOB | 運行時暫停作業表 |
ACT_RU_DEADLETTER_JOB | 運行時死信表 |
1. ACT_RU_EXECTION
該表記錄運行時的流程實例與分支的執行信息
該運行時執行表爲啓動下面的流程圖後的結果,我們啓動該流程,首先進入到callActivity(調用式子流程),該子流程會調用第二幅圖中的流程,因此運行時的執行表會有這麼多條記錄(包括兩條主幹線,以及其他的節點記錄)。
關鍵字段說明:
BUSINESS_KEY_
:爲業務標識,主流程纔會擁有業務主鍵,可以在開啓流程實例的時候注入,該業務標識只有在主線流程中可以查看到。
PARENT_ID_
:父執行ID,對應的是上一執行信息的ID號SUPER_EXEC_
:調用式子流程的父執行ID(一般爲CallActiviti所對應的ID)IS_ACTIVE_
:是否活動流程實例,0爲非活動,1爲活動(一個分支節點完成,則該分支的IS_ACTIVE會變爲0)- IS_CONCURRENT_:是否併發,0爲非併發,1爲併發(這裏的併發並非並行執行的概念)
IS_SCOPE
:是否全局流程執行,0非,1是- IS_EVENT_SCOPE_:是否激活狀態,沒有使用到事件的情況下,一般都爲0
- IS_MI_ROOT_:是否多實例根執行流
SUSPENSION_STATE_
:掛起狀態,1正常,2掛起- CACHED_ENT_STATE_:緩存結束狀態
- LOCK_TIME_:鎖定時間,鎖定時間是不被併發操作的
剩下的幾個帶有 _COUNT_的字段爲其他幾張運行時表的記錄數,需要配置activiti.cfg.xml的
<property name=“enableExecutionRelationshipCounts” value=“true”/>計數器功能,才生效
2. ACT_RU_TASK
該表記錄運行時的 userTask任務信息。
關鍵字段說明:
- PARENT_TASK_ID_:父節點任務ID,由父節點間接啓動
- OWNER_:擁有人,一般情況下爲空,只有在委託時纔有值
- DELEGATION_:委託狀態,PENDING委託中,RESOLVED已處理,無委託則爲空
PRIORITY_
:優先級別,默認爲50(Main Config中可配置)DUE_DATE_
:過期時間(Main Config中可配置)CATEGORY_
:類別(Main Config中可配置)SUSPENSION_STATE_
:掛起狀態,1正常,2掛起CLAIM_TIME_
:該任務節點的獲取時間
3. ACT_RU_VARIABLE
記錄運行時的變量信息
關鍵字段說明:
TYPE_
:類型integer,String,double,json,null等BYTEARRAY_ID_
:資源信息ID,若該變量需要用到資源表中的信息,則對應的是資源表中的ID值TEXT2_
:存儲持久化對象的對象ID
四、身份數據表
數據表分類 | 描述 |
---|---|
ACT_ID_USER | 用戶基本信息表 |
ACT_ID_GROUP | 用戶組表 |
ACT_ID_MEMBERSHIP | 用戶與組關係表 |
ACT_ID_INFO | 用戶擴展信息表 |
這一類表是五大類中最簡單,最容易理解的,但一般在項目開發中,我們通常會使用自己的用戶表。
Activiti中對用戶和用戶組的支持自帶有POJO對象,並支持序列化。如下面表示 ACT_ID_USER 表對應的POJO類
1. ACT_ID_USER
該表存放用戶的基本信息,包括用戶名、電子郵箱、密碼、照片等
REV
:仍然表示的是樂觀鎖,表示對該用戶進行修改的次數。
public static void setUser() throws Exception {
User user = identityService.newUser("004");
user.setFirstName("劉");
user.setLastName("啓明");
user.setEmail("[email protected]");
user.setPassword("123456");
identityService.saveUser(user);
//爲某個用戶設置照片
InputStream imInputStream = IdentityServiceTest.class.getClassLoader()
.getResourceAsStream("diagrams/photo.jpeg");
byte[] data = toByteArray(imInputStream);
String mimeType = "photo";
Picture picture = new Picture(data, mimeType);
identityService.setUserPicture("001" ,picture);
System.out.println("設置用戶成功");
}
2. ACT_ID_GROUP
用戶組表存放用戶的羣組信息,包括用戶組名、組類型。
private static void setGroup(){
Group userGroup = identityService.newGroup("01");
userGroup.setName("用戶組");
userGroup.setType("用戶");
identityService.saveGroup(userGroup);
System.out.println("設置組成功");
}
當然,上面的 ID_值,不一定要是數字,可以是字符串類型。
3.ACT_ID_MEMBERSHIP
用戶關係表存放用戶隸屬的表,通過 IdentityServiceImpl 的 createMembership(String userId, String groupId) 方法可以直接創建用戶組關係
private static void setMembership(){
identityService.createMembership("001", "01");
identityService.createMembership("003", "01");
identityService.createMembership("004", "01");
identityService.createMembership("002", "02");
identityService.createMembership("003", "03");
identityService.createMembership("004", "04");
System.out.println("設置用戶關係成功");
}
同樣的,這裏的 USER_ID_ 和 GROUP_ID_ 只要是字符串類型就可以。
4. ACT_ID_INFO
用於存放除基本信息外的的擴展信息,如年齡、地址、聯繫方式等
private static void setInfo(){
identityService.setUserInfo("001", "age", "18");
identityService.setUserInfo("001", "address", "BeiJing");
}
關鍵字段說明:
TYPE_
:信息類型,可以設置用戶賬號(account)、用戶信息(userinfo)和NULL三種值。PASSWORD_
:用戶賬號的密碼字段,當前的Activiti版本並沒有使用該字段。PARENT_ID_
:該信息的父信息ID,如果一條數據設置了父信息ID,則表示該數據是用戶賬號(信息)的明細數據,例如一個賬號有激活日期,那麼激活日期就是該賬號的明細數據,此處使用了自關聯來實現。
五、歷史數據表
數據表分類 | 描述 |
---|---|
ACT_HI_ACTINST | 歷史節點信息表 |
ACT_HI_ATTACHMENT | 歷史附件表 |
ACT_HI_COMMENT | 歷史評論表 |
ACT_HI_DETAIL | 歷史詳細變更表 |
ACT_HI_IDENTITYLINK | 歷史參與者表 |
ACT_HI_PROCINST | 歷史流程實例表 |
ACT_HI_TASKINST | 歷史任務表 |
ACT_HI_VARINST | 歷史變量表 |
1. ACT_HI_PROCINST
歷史流程實例表,該表記錄流程引擎啓動的流程實例。只要有一條實例啓動,無論該實例是否完成,都會在該表中插入一條記錄。
關鍵字段說明:
-
DURATION_
:記錄流程開始到結束的時間,單位爲毫秒 -
SUPER_PROCESS_INSTANCE_ID_
:調用式子流程中的父流程的ID值
2. ACT_HI_ACTINST
歷史節點信息表,該表記錄流程運行過程中的每個節點信息,包括開始節點、結束節點、用戶任務、服務任務、網關等
關鍵字段說明:
-
TASK_ID_
:只有用戶任務纔有TASK_ID值 -
CALL_PROC_INST_ID_
:針對callActivity調用式子流程中的被調用的流程實例ID值
3. ACT_HI_TASKINST
用戶任務實例表,記錄歷史的用戶任務信息
關鍵字段說明:
PARENT_TASK_ID_
:父節點調用的任務IDCLAIM_TIME_
:該節點的獲取時間