Activiti工作流內建數據庫表分析

image.png

如上圖所示: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的運行表和歷史表在流程運行時是同步記錄數據的,當流程實例結束時,會刪除運行表種的數據,保留歷史表中的數據。

在有網關節點時,辦理任務需要額外傳入網關條件參數,指引工作流正確運轉到下一個節點(網關條件對應具體的連接線):

image.png

如上圖,在辦理該節點時,需傳入參數"wayType",值為1時流程運轉至該連接線!
5、流程配置
1)節點辦理人、候選人、候選組
可以將工作流對接至自定義的數據庫用戶、角色信息表,具體方法請參考我的這篇文章:Activiti對接業務表實現自定義用戶和用戶組
對接成功后可以改造流程設計器的選定用戶、用戶組界面,實現如下效果:
image.png

可以直接點擊選擇節點的辦理人、候選人、候選組;
至此,我對工作流的一些常見知識做了初步總結,希望對讀者有幫助!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,401評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,011評論 3 413
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,263評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,543評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,323評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,874評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,968評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,095評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,605評論 1 331
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,551評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,720評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,242評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,961評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,358評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,612評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,330評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,690評論 2 370

推薦閱讀更多精彩內容