《Activiti實戰》摘抄&筆記3

##Query API簡介 Activiti的查詢API:
1)標準查詢 :在以Java對象的方式經過建立一個指定類型的Query對象(實現Query接口)後用鏈式編程的方式設置查詢參數。弊端:不能支持複雜的查詢,好比多張表聯合查詢或者使用OR關係查詢;
2)Native查詢 :容許採用標準SQL的方式查詢流程對象,不過Native查詢僅支持部分流程對象(查詢結果只能返回引擎的固定幾個對象,返回結果不能自定義),而且查詢對象須要實現NativeQuery接口。sql(String sql)能夠接受一個標準的SQL語句。其中表名能夠經過ManagementService#getTaskName()獲取,條件以MyBatis的格式設置,以'#'標註一個參數的開始,而後用'{...}'設置參數名稱,最後用鏈式編程方式調用paramter()方法設置每個參數的值。
3) CustomSqlExecution : 基於Mybatis的查詢接口,容許開發人員使用Mybatis的語法查詢數據,而且查詢結果的類型很靈活,該功能被封裝在ManagementService接口的executeCustomSql方法中: <MapperType, ResultType> ResultType executeCustomSql(CustomSqlExecution<MapperType, ResultType> customSqlExecution);
MapperType:表示定義Mybatis語法查詢的接口類型;
ResultTYpe:表示返回結果的類型;
Query APIsql

##管理員特性 流程狀態
假設這樣一個場景:一個正在運行的流程實例因爲某些緣由要暫停,從技術上來講就是"掛起",當條件知足以後再恢復狀態繼續運行該流程實例。數據庫

在Activiti中,這一過程有2個對應的操做:掛起(suspend)、激活(active)。除了控制流程實例外還能夠控制流程定義(ProcessDefinition)的狀態,而且能夠選擇是否激活與流程定義相關的流程實例,以及定是激活或掛起。編程

流程定義權限控制
從Activiti5.10版本開始引擎把用戶任務的候選配置移植到流程級別上,從而能夠根據登陸系統的用戶所擁有的角色決定是否有權查詢、啓動流程。設計模式

讀取引擎屬性
引擎提供了一個便捷的接口能夠快速獲取引擎配置信息:managementService.getProperties();緩存

讀取引擎屬性
引擎提供了查詢引擎數據庫的接口,用戶獲取與引擎數據庫表的結構、記錄。此功能封裝在ManagementService接口中。TableMetaData,TablePage...mybatis

##統一身份管理
在一個完整的系統中,身份模塊式必不可少的,用於管理系統的用戶、組織、角色或崗位。大多數系統都會有組織的管理,而在Activiti中並無組織的概念,也沒有角色的管理,取而代之的是組。架構

###引擎身份接口方式
####1. 經過引擎接口同步數據 經過引擎接口同步數據是一種「非侵入式」的同步方法,作法相似於引擎中的監聽,當現有身份模塊的用戶數據變動時調用Activiti引擎的IdentityService接口的對應方法同步操做。固然在同步數據時要作好數據的校驗工做,例如在添加、修改用戶和組時要先檢查對象是否存在防止引擎接口拋出異常。app

這種同步身份數據方式的特色在於「不破壞」引擎表結構、面向接口編程。若是根據用戶ID查詢相關的候選任務,那麼SQL的過濾條件:在ACT_RU_IDENTITYLINK表中類型類candidate且USER_ID_字段等於當前用戶ID,或任務有候選組且當前人與候選組有關聯關係(在ACT_ID_MEMBERSHIP表中維護)。ide

當咱們操做業務系統的用戶、角色以及二者關係時把這些更改都同步到引擎的表中,因此引擎內部的SQL關聯查詢能夠正常工做。之因此在這裏強調用戶與組的關係是由於下面介紹的第2種方式就不能使用與ACT_ID_MEMBERSHIP表關聯查詢了,由於下面的方式會禁用引擎的身份模塊表。工具

####2. 自定義Session工廠
Activiti的每一張表都有一個對應的實體管理器,在引擎初始化時會初始化全部表的實體管理類(提供CRUD等功能),每個實體類都有一個對應的實體管理類(XxxEntityManager)及 實體管理工廠類(XxxEntityManagerFactory)。實體管理工廠類實現SessionFactory接口。 (是個坑,可能本身沒有理解透,TaskService底層也有用到identity相關的表作關聯,單單隻改IdentityService用到的實體類管理工具不夠。後來就直接繼承ProcessEngineConfiguration相關實現類重寫getMyBatisXmlConfigurationSteam方法修改mybatis配置文件裏的identity相關的mapping文件)

####3. 用視圖代替物理表
在引擎中,和身份相關的表以下:
ACT_ID_USER: 用戶表;
ACT_ID_INFO:用戶信息表;
ACT_ID_GROUP:組,也能夠理解爲角色;
ACT_ID_MEMBERSHIP:用戶與組的關係,這也是查詢任務候選人須要關聯的表。

相比前2種方式,使用視圖代理物理表顯得「輕量」一些,把引擎的物理表刪除,取而代之是與物理表同名的視圖,只要保證視圖的結構與原來物理表的表結構及字段類型一致便可。

採用這種方式須要在配置引擎的時候把屬性dbIdentityUsed設置爲false,即禁用身份模塊的功能,其實是在初始化引擎時再也不檢查ACT_ID_*表是否存在。

##REST服務 發佈REST API
集成REST API
集成流程圖跟蹤組件Diagram Viewer
基於REST服務搭建流程中心:基礎架構,表單模型選型,統一的組件,事務管理
集成流程設計器Activiti Moderler

##入侵Activiti ###解析BPMN文件 部署流程:

  1. 引擎會解析XML格式的流程文件提取流程定義(ProcessDefinition)對象,部署動做由BpmnDeployer類負責,下圖展現該類依賴的各類解析器、處理器的結構圖:
  2. 把BpmnDeployer處理獲得的流程對象,保存到引擎數據庫並緩存;
    3)同時也會保存相關的資源文件到數據庫。

###命令與攔截器
外觀模式(Facade)、命令模式(Command)、攔截器模式(Interceptor)是常見的設計模式,也是Activiti總體架構採用的三種主要設計模式,全部的API均以這三種模式爲基礎實現。

「面向接口編程」是Activiti API設計的一大設計思想,對外公開的全部API均用抽象定義的方式,提供了7大模塊的XxxService接口,這也是採用了外觀模式的表現;引擎的內部實現不對外公開,開發人員只要調用暴露的API編程接口實現相應的功能。基於抽象的接口還能夠覆蓋引擎內部的實現,使用自定義的實現類替換(在引擎配置對象中能夠配置)。

在Activiti中全部操做均對應一個命令接口(Command)實現類,這樣不一樣的功能分散到N個命令中,易於維護與擴展;當調用引擎XxxService接口時其實是調用不一樣的Commande,但接口並非直接調用命令,而是把命令交給CommandExecutor統一執行,由於經過它能夠在命令執行中執行若干攔截器(相似JAVAEE中的Filter鏈)。

Activit中的攔截器能夠爲全部的Command命令準備好命令上下文(CommandContext)對象,以便在Command實現類中獲取到引擎配置對象(獲取引發配置屬性)、會話對象(Session),以及其餘擴展屬性等;還能夠爲Command提供食物管理器、樂觀鎖自動重試等功能。

###流程虛擬機PVM
PVM(Process Virtual Machine)流程虛擬機,是Activiti整個流程驅動(流程推動)機制的核心規範。

Activiti源碼分析

相關文章
相關標籤/搜索