activiti工作流筆記


什么是activiti?

Activiti是一個身經百戰的業務流程管理引擎, 並且還是一個流程平台

為什么要用工作流引擎?

簡單來說,就是為了統一管理流程業務。
想想看,如果要設計一個流程的程序,通常需要在數據庫中存各種狀態值,比如一個訂單程序,要標記訂單是未付款、已付款、已出庫等等狀態,而這些各種各樣的狀態參雜在程序中,邏輯自然就變得復雜了。
而將這些狀態對應到流程里的一個個步驟,交由流程引擎去管理,這樣不僅簡化了業務邏輯代碼,
而且,還有很強的擴展性。
eg:我可以修改我的流程,我可以添加一些步驟而不用改我的數據庫表結構,不用改我的業務邏輯。
狀態機---->工作流。

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM