首先交代下背景:我們有一個已經上線的activiti工作流系統,對於流程圖的操作已經封裝好部署,查看,刪除的接口。此時客戶提出要修改個別流程圖里的節點名稱。
我的第一個想法就是本地修改流程圖bpmn文件,然后去客戶端先調用刪除接口刪除舊流程圖,然后調用部署接口添加修改后的流程圖,然而事實上,因為系統已經上線,此時存在大量運行中的工作流數據,一旦執行刪除操作,刪除流程圖的同時,會把相關的工作流數據全部清空。
我的第二個想法是,在客戶端保存流程圖的地方直接修改節點名稱。結果找了一下發現activiti的流程圖是以二進制代碼的形式保存在數據庫里的,這也不是說就一定不能改,但是肯定不好改。
最終的做法:
觀察數據庫結構得知,流程圖name_、key_等字符型屬性保存在表ACT_RE_PROCDEF里,而bpmn、png等文件屬性保存在表ACT_GE_BYTEARRAY里,兩張表通過DEPLOYMENT_ID_列進行一對多關聯。
所以,可以將修改后的新流程圖直接用部署接口添加上,將舊流程圖的ACT_GE_BYTEARRAY表數據刪除,將新流程圖的ACT_RE_PROCDEF表數據刪除,然后將新流程圖的ACT_GE_BYTEARRAY表數據里的DEPLOYMENT_ID_修改成舊流程圖ACT_RE_PROCDEF表數據的DEPLOYMENT_ID_,完成。