什么是activiti?
Activiti是一個身經百戰的業務流程管理引擎, 並且還是一個流程平台
為什么要用工作流引擎?
想想看,如果要設計一個流程的程序,通常需要在數據庫中存各種狀態值,比如一個訂單程序,要標記訂單是未付款、已付款、已出庫等等狀態,而這些各種各樣的狀態參雜在程序中,邏輯自然就變得復雜了。
而將這些狀態對應到流程里的一個個步驟,交由流程引擎去管理,這樣不僅簡化了業務邏輯代碼,
API介紹
(一)
額外再加一個: DynamicBpmnService:提供動態獲取,以及動態修改流程定義的方法。
Activiti的后台是有數據庫的支持,所有的表都以ACT_開頭。 第二部分是表示表的用途的兩個字母標識。用途也和服務的API對應。
1) ACT_RE_*: ‘RE’表示repository。 這個前綴的表包含了流程定義和流程靜態資源(圖片,規則,等等)。
2) ACT_RU_*: ‘RU’表示runtime。 這些運行時的表,包含流程實例,任務,變量,異步任務,等運行中的數據。 Activiti只在流程實例執行過程中保存這些數據,在流程結束時就會刪除這些記錄。 這樣運行時表可以一直很小速度很快。
3) ACT_ID_*: ‘ID’表示identity。 這些表包含身份信息,比如用戶,組等等。
4) ACT_HI_*: ‘HI’表示history。 這些表包含歷史數據,比如歷史流程實例,變量,任務等等。
5) ACT_GE_*: 通用數據, 用於不同場景下。
資源庫流程規則表
1) act_re_deployment 部署信息表
2) act_re_model 流程設計模型部署表
3) act_re_procdef 流程定義數據表
運行時數據庫表
1) act_ru_execution 運行時流程執行實例表
2) act_ru_identitylink 運行時流程人員表,主要存儲任務節點與參與者的相關信息
3) act_ru_task 運行時任務節點表
4) act_ru_variable 運行時流程變量數據表
5) act_ru_timer_job (5.22不存在)
6) act_ru_suspended_job (5.22不存在)
7) act_ru_event_subscr
8) act_ru_deadletter_job (5.22不存在)
9) act_ru_job
歷史數據庫表
1) act_hi_actinst 歷史節點表
2) act_hi_attachment 歷史附件表
3) act_hi_comment 歷史意見表
4) act_hi_identitylink 歷史流程人員表
5) act_hi_detail 歷史詳情表,提供歷史變量的查詢
6) act_hi_procinst 歷史流程實例表
7) act_hi_taskinst 歷史任務實例表
8) act_hi_varinst 歷史變量表
組織機構表
1) act_id_group 用戶組信息表
2) act_id_info 用戶擴展信息表
3) act_id_membership 用戶與用戶組對應信息表
4) act_id_user 用戶信息表
這四張表很常見,基本的組織機構管理,關於用戶認證方面建議還是自己開發一套,組件自帶的功能太簡單,使用中有很多需求難以滿足
通用數據表
1) act_ge_bytearray 二進制數據表
2) act_ge_property 屬性數據表存儲整個流程引擎級別的數據,初始化表結構時,會默認插入三條記錄
(二) ACT_RE_MODEL
1 查詢model 是否存在
List<Model> modelList = repositoryService.createModelQuery().modelName("Demo model").list();
2 有三個外鍵,對應ACT_GE_BYTEARRAY的有兩個。
EDITOR_SOURCE_VALUE_ID_對應ACT_GE_BYTEARRAY的ID_,表示該模型對應的模型文件(json格式數據)。
repositoryService.addModelEditorSource方法實現。
EDITOR_SOURCE_EXTRA_VALUE_ID_對應ACT_GE_BYTEARRAY的ID_,表示該模型生成的圖片文件。
repositoryService.addModelEditorSourceExtra方法實現。
3 保存model
Model modelData = repositoryService.newModel();
repositoryService.saveModel(modelData);
執行對應的SaveModelCmd。會插入或更新ACT_RE_MODEL的數據。
SaveModelCmd對應的execute方法:
public Void execute(CommandContext commandContext) { if (this.model == null) { throw new ActivitiIllegalArgumentException("model is null"); } else { if (this.model.getId() == null) { commandContext.getModelEntityManager().insertModel(this.model); } else { commandContext.getModelEntityManager().updateModel(this.model); } return null; } }
// insert方法分發ENTITY_CREATED和ENTITY_INITIALIZED事件:
public void insertModel(Model model) { ((ModelEntity)model).setCreateTime(Context.getProcessEngineConfiguration().getClock().getCurrentTime()); ((ModelEntity)model).setLastUpdateTime(Context.getProcessEngineConfiguration().getClock().getCurrentTime()); this.getDbSqlSession().insert((PersistentObject)model); if (Context.getProcessEngineConfiguration().getEventDispatcher().isEnabled()) { Context.getProcessEngineConfiguration().getEventDispatcher().dispatchEvent(ActivitiEventBuilder.createEntityEvent(ActivitiEventType.ENTITY_CREATED, model)); Context.getProcessEngineConfiguration().getEventDispatcher().dispatchEvent(ActivitiEventBuilder.createEntityEvent(ActivitiEventType.ENTITY_INITIALIZED, model)); } } // update方法分發ENTITY_UPDATED方法: public void updateModel(ModelEntity updatedModel) { CommandContext commandContext = Context.getCommandContext(); updatedModel.setLastUpdateTime(Context.getProcessEngineConfiguration().getClock().getCurrentTime()); DbSqlSession dbSqlSession = commandContext.getDbSqlSession(); dbSqlSession.update(updatedModel); if (Context.getProcessEngineConfiguration().getEventDispatcher().isEnabled()) { Context.getProcessEngineConfiguration().getEventDispatcher().dispatchEvent(ActivitiEventBuilder.createEntityEvent(ActivitiEventType.ENTITY_UPDATED, updatedModel)); } }
(三) 流程發起人
identityService.setAuthenticatedUserId(user.getId());
參考:https://www.cnblogs.com/skilltalent-huan/articles/5091592.html
workFlow學習總結---------------------常用的工作流引擎
https://blog.csdn.net/liuwenbiao1203/article/details/53158254
Activiti 5.16 用戶手冊
http://www.mossle.com/docs/activiti/index.html#bpmnConstructs
三分鍾明白 Activity工作流 -- java運用
https://blog.csdn.net/jiangyu1013/article/details/73250902
官網Quick Start Guide
https://www.activiti.org/quick-start
BPMN 2.0規范詳解
https://blog.csdn.net/a123demi/article/details/50674124