activiti搭建(四)八項服務介紹


    轉載請注明源地址:http://www.cnblogs.com/lighten/p/5927949.html

1.前言

    之前學習的時候一直在其它文章看到activiti提供了七個接口來操作工作流,但在5.21版本中,查看源碼發現目前是提供了八個服務。這里說個查看源碼的小技巧,查看源碼要弄明白創作者的思路,也就要看其寫的功能模塊和類的繼承體系了,在eclipse中點擊類名,按F4就能查看這個類的相關信息和繼承了這個類的子類,一般都是點在抽象類和接口上,這樣可以很快看到有些什么內容。舉個例子,activiti是由配置文件開始的,這樣就可以點擊ProcessEngineConfiguration,按F4查看,往上看其實現的接口,一層層向上,最終會看到如下圖的結構:

image

    這里最上層的就是接口EngineServices,里面一個是配置,一個是流程引擎。配置就是用來設置相關參數的,並用於初始化流程引擎,流程引擎用於提供相關服務。八項服務可以從配置類中看到,更直接的就是從ProcessEngineImpl中看里面的方法。下圖為配置中定義的地方:

image

    下面給出這八項服務在源碼中的注解及其翻譯(翻譯的不好,直接看原注解):

    (1)RepositoryService:Service providing access to the repository of process definitions and deployments.服務提供與流程定義和部署存儲的關聯。

    (2)RuntimeService:無英文注解,用於一條流程運行的相關操作。

    (3)HistoryService:Service exposing information about ongoing and past process instances.  This is different from the runtime information in the sense that this runtime information only contains the actual runtime state at any given moment and it is optimized for runtime process execution performance.  The history information is optimized for easy querying and remains permanent in the persistent storage.服務公開了正在進行的以及過去的流程實例相關信息。不同於運行時的信息,運行時信息只包含任意給出的時刻實際運行的狀態,這有益於運行時流程執行性能。歷史信息有利於查詢並且是永久保存的。

    (4)IdentityService:Service to manage {@link User}s and {@link Group}s.服務用於管理用戶和用戶組。

    (5)TaskService:Service which provides access to {@link Task} and form related operations.服務提供任務和表單關聯的相關操作。

    (6)FormService:Access to form data and rendered forms for starting new process instances and completing tasks.提供表單數據和呈現表單為啟動一個新的流程實例和完成任務。

    (7)ManagementService:Service for admin and maintenance operations on the process engine.服務管理和維護流程引擎的操作。

    (8)DynamicBpmnService:Service providing access to the repository of process definitions and deployments.這個注解和RepositoryService的相同,但里面的方法肯定是不同的。我查了一下,這個服務是在5.19版本開始提供的,從名稱和里面的方法名來看是用於動態改變信息的。

2.服務內容詳解

    以RepositoryService詳細介紹,其它的類似,大致歸類一下(具體方法用eclipse的快捷提示鍵,一般知道每個服務大致提供什么功能,直接看名字差不多就知道是不是自己需要的)。這里對所有服務的方法名通用的規則做個簡單的介紹:createXXX這種名稱的方法一般是為了構建查詢器,但也有創建對象的,如createDeployment(),這個是個例外。newXXX一般就是創建實際內容了,比如newModel(),newUser(),配合saveXXX來保存對象內容。getXXX就是為了獲得一些內容了,deleteXXX就是刪除一些內容了。至於addXXX和setXXX這兩個很難划分差別,add可能偏向於添加額外的東西,如關系,監聽器等,set偏向於設置屬性。removeXXX是移除,和刪除還是有很大的區別。當然還會有其它的方法名,是服務特有的內容,無法用這種規律性的名稱。

2.1 RepositoryService

    RepositoryService管理流程定義和部署及相關資源的操作。

1.創建一個模型(模型是用於設計流程圖的原型)

  Model newModel();

2.保存一個模型

  void saveModel(Model);

3.創建部署者

  DeploymentBuilder createDeployment();

4.部署

  Deployment deploy(DeploymentBuilder);

5.添加:add

    為定義的流程授權用戶(這個用在什么地方有什么效果暫時未知):

    addCandidateStarterGroup(processDefinitionId, userId)

    addCandidateStarterUser(processDefinitionId, userId)

    添加模型編輯的資源:

    addModelEditorSource(modelId, byte[])

    addModelEditorSourceExtra(modelId, byte[])

6.查詢:create

    創建查詢,查詢部署信息,查詢流程定義,查詢模型信息:

    createModelQuery()    createNativeModelQuery()

    createDeploymentQuery()    createNativeDeploymentQuery()

    createProcessDefinitionQuery()    createNativeProcessDefinitionQuery()

7.獲取資源:get

    獲取模型,部署和流程定義等資源:

    ReadOnlyProcessDefinition getDeployedProcessDefinition(processDefinitionId)

    List<String> getDeploymentResourceNames(deploymentId)

    List<IdentityLink> getIdentityLinksForProcessDefinition(processDefinitionId)

    Model getModel(modelId)

    …(這里就不具體說明了,使用的時候直接使用提示鍵)

8.刪除資源:delete

    刪除模型,部署和流程定義的授權群體:

    deleteModel(modelId)

    deleteDeployment(deploymentId, boolean cascade) cascade決定是否刪除流程實例

    deleteCandidateStarterUser(processDefinitionId, userId)

    deleteCandidateStarterGroup(processDefinitionId, groupId)

9.激活和掛起定義的流程:activate | suspend

    定義流程,激活流程和掛起流程都有兩種方式:通過流程定義id(這個一般是程序自動生成的)或者是流程定義key(這個是自定義的關鍵字,用於識別具體是哪個流程。注意:雖然程序中並沒有限制其一定不同,但是一般只用於同一個流程,版本更新才會使用同一個key,不然按照程序邏輯,使用相同key值得流程,按key值查找,只會找最近一個設置為這個值的流程定義)。

    activateProcessDefinitionById    activateProcessDefinitionByKey

    suspendProcessDefinitionById    suspendProcessDefinitionByKey

    這些方法中可以設置具體激活或者掛起的日期,但是這要開啟job executor,這個是舊版本的,在較新的版本中應該是async executor(前一個官方文檔中說是歷史遺留問題,一般推薦使用新的機制,但是前一個還是可以使用)。

10.其它

    changeDeploymentTenantId(deploymentId, newTenantId)

    boolean isProcessDefinitionSuspended(processDefinitionId)

    setDeploymentCategory(deploymentId, category)

    setProcessDefinitionCategory(processDefinitionId, category)

    List<ValidationError> validateProcess(BpmnModel)

2.2 其他

    RuntimeService:主要與流程實例有關,流程定義是指設計的一個流程,流程實例是指真正的一個事件,比如請假流程是設計的一個流程,小明請假則是一個具體的流程實例。這項服務可以創建一個流程實例,即啟動一個流程,中斷或者激活一個流程實例,以及設置信號事件觸發器,消息時間觸發器(這些和啟動流程的條件有關),設置變量,事件監聽等一系列和流程實例有關的操作。

    HistoryService:主要是用於查詢流程的運行記錄,只有查詢和刪除的操作,沒有增加和修改。主要查詢活動實例,細節,流程實例,變量實例以及任務實例,對應數據庫中相應的表。

    IdentityService:主要用於控制用戶和用戶組,要注意流程引擎本身是沒有用戶限制的,在用戶任務的時候可以指定用戶完成,這個不是必須的。這個服務包括用戶以及用戶組的:創建,保存和刪除,以及它們之間的關系,用戶詳細信息的創建等操作。

    TaskService:主要用於流程中的任務節點的相關操作,BPMN實際上有很多種類型的任務,不單單是用戶任務,這個的設置主要是針對用戶任務的相關設置,其它類型的任務並不需要太多的設置,大部分都是自動類型的任務,需要相應的觸發條件。

    FormService:主要用於表單數據的保存和獲取,有啟動流程的表單和任務過程中產生的表單。

    ManagementService:這個服務功能比較雜,看里面的方法大致有這些功能:查詢數據庫表的相關信息,Job相關的查詢,刪除。還有事件日志的相關操作。總的來說是activiti的一些全局相關的操作。

    DynamicBpmnService:這個服務是5.19版本后新增的一個服務,和RepositoryService的作用相似,都是與流程定義有關,但是卻完全不同。從名字上來看是動態的BPMN服務,看里面的方法都是改變流程的相關屬性。這個方法就可以直接操作流程定義,而不需要讀取模型,再設計部署(一個流程基本要經過創建模型,設計畫圖,生產BPMN的XML文件,再部署成流程定義,這個服務就可以直接操作流程定義,不會改變原本的文件,個人感覺可能會帶來一些的問題,但是目前對於流程流轉內部實現還沒有完全理解,使用要謹慎,比如有的流程正在運行老版本的定義,這個時候改變流程定義,接下來怎么流轉之類的都是問題)。

3 最后

    對於工作流,實際上看其接口就能大致使用了,但這樣還是不夠的。如果再加上其核心本質的BPMN的相關知識,大致對應用場景有所認識,就能更好的理解這個工具了。下一章預計就是介紹BPMN的相關知識了。這些都了解了之后就會實際介紹具體如何操作了,測試工作流的各個組件的用法。但是這樣僅僅是會使用而已,一些細節的坑不看源代碼不會發現有值得注意的地方,比如上面說的流程定義的KEY,基本是不能相同的,但是代碼中沒有控制,也不會控制,因為是允許的,有這樣的場景會需要KEY相同。如果這些流程,操作不當就會產生不可預知的問題了。所以深入了解源碼還是有必要的。


免責聲明!

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



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