Spring中部署Activiti流程定義的三種姿勢

摘要:本文對工作流Activiti框架中流程定義的部署進行了詳細說明介紹。

本文分享自華爲雲社區《項目中工作流部署詳細解析!Spring中部署Activiti流程定義的三種姿勢》,作者:攻城獅Chova 。

業務文檔

  • 爲了部署流程,需要包裝在一個業務文檔中
    • 一個業務文檔是Activiti引擎部署的單元
    • 一個業務文檔相當與一個壓縮文件,它包含:
      • BPMN2.0流程
      • 任務表單
      • 規則
      • 其他任意類型的文件
    • 業務文檔是包含命名資源的容器
  • 當一個業務文檔被部署,它將會自動掃描以**.bpmn20.xml或者.bpmn**作爲擴展名的BPMN文件.每個那樣的文件都將會被解析並且可能會包含多個流程定義
業務歸檔中的Java類將不能夠添加到類路徑下
爲了能夠讓流程運行,必須把存在於業務歸檔程中的流程定義使用的所有自定義的類(例如:Java服務任務或者實現事件的監聽器)放在 [activiti引擎的類路徑] 下

編程式部署

  • 通過一個壓縮文件(支持Zip和Bar)部署業務文檔
  • 也可以通過一個獨立資源(例如bpmn,xml等)構建部署
String barFileName = "path/to/process-one.bar";
ZipInputStream inputStream = new ZipInputStream(new FileInputStream(barFileName));

repositoryService.createDeployment()
    .name("process-one.bar")
    .addZipInputStream(inputStream)
    .deploy();

通過Activiti Explorer控制檯部署

  • Activiti web控制檯允許你通過web界面的用戶接口上傳一個bar格式的壓縮文件(或者一個bpmn20.xml格式的文件).選擇Management 標籤和點擊Deployment:

外部資源

  • 流程定義保存在Activiti所支持的數據庫中
  • 當使用服務任務,執行監聽器
  • 從Activiti配置文件中配置的Spring beans時,流程定義能夠引用這些委託類.
  • 這些類或者Spring配置文件對於所有流程引擎中可能執行的流程定義必須是可用的

Java類

  • 當流程實例被啓動的時候,在流程中被使用的所有自定義類應該存在流程引擎的類路徑下:
    • 服務任務中:
      • JavaDelegates
      • 事件監聽器
      • 任務監聽器
    • 在部署業務文檔時,這些類不必都存在於類路徑下.當使用Ant部署一個新的業務文檔時,意味着你的委託類不必存在類路徑下
  • 當使用示例設置添加自定義類:
    • 應該添加包含自定義類的jar包到activiti-explorer控制檯
    • activiti-restwebapp lib文件夾中
    • 不要忽略包含你自定義類的依賴關係
    • 還可以將你自定義的依賴添加到你的Tomcat容器的安裝目錄中的${tomcat.home}/lib

流程中使用Spring beans

  • 當表達式或者腳本使用Spring beans時,這些beans對於引擎執行流程定義時必須是可用的
  • 如果要構建自定義的web應用並且按照Spring集成在應用上下文配置流程引擎.要記住,如果在使用Activiti rest web應用,那麼也應該更新Activiti rest web應用的上下文.可以把在activiti-rest/lib/activiti-cfg.jar文件中的activiti.cfg.xml替換成的Spring上下文配置的activiti-context.xml文件

創建獨立應用

  • 可以將Activiti rest web應用加入到web應用之中,只需要配置一個 ProcessEngine,
  • 從而不用確保所有的流程引擎的所有委託類在類路徑下面並且是否使用正確的spring配置

流程定義的版本

    • BPMN中並沒有版本的概念,而在Activiti中,流程定義的版本會在部署時創建,在部署的時候,流程定義被存儲到Activiti使用的數據庫之前,Activiti將會自動給流程定義分配一個版本號
    • 業務文檔中每一個的流程定義,都會通過下列部署執行初始化屬性key,version,nameid:
      • XML文件中流程定義(流程模型)的id屬性被當做是流程定義的key屬性
      • XML文件中的流程模型的name屬性被當做是流程定義的name 屬性.如果該name屬性沒有指定,那麼id屬性被當作是name屬性
      • 帶有特定key的流程定義在第一次部署的時候,將會自動分配版本號爲1,對於之後部署相同key的流程定義時候,這次部署的版本號將會設置爲比當前最大的版本號大1的值.該key屬性被用來區別不同的流程定義
      • 流程定義中的id屬性被設置爲 {processDefinitionKey}:{processDefinitionVersion}:{generated-id}, 這裏的generated-id是一個唯一的數字被添加, 用於確保在集羣環境中緩存的流程定義的唯一性
<definitions id="myDefinitions" >
  <process id="myProcess" name="My important process" >
    ...

當部署了這個流程定義之後,數據庫中的流程定義如下:

  • 假設部署用一個流程的最新版本號(改變用戶任務),但是流程定義的id保持不變.流程定義表將包含以下列表信息:

runtimeService.startProcessInstanceByKey(“myProcess”) 方法被調用時,它將會使用流程定義版本號爲2的, 因爲這是最新版本的流程定義.可以說每次流程定義創建流程實例時,都會默認使用最新版本的流程定義

  • 創建第二個流程,在Activiti中,定義並且部署它,該流程定義會添加到流程定義表中:
<definitions id="myNewDefinitions" >
  <process id="myNewProcess" name="My important process" >
    ...
  • 表結構如下所示:

  • 注意: 新流程的key與我們的第一個流程是不同的,儘管流程定義的名稱name是相同的(當然,名稱name也可以是不相同的),Activiti僅僅只考慮id屬性判斷流程. 因此,新的流程定義部署的版本號爲1

提供流程圖片

  • 流程定義的流程圖可以被添加到部署中,該流程圖將會持久化到Activiti所使用的數據庫中並且可以通過Activiti的API進行訪問.
  • 流程圖也可以被用來在Activiti Explorer控制檯中的流程中進行顯示
  • 如果在我們的類路徑下面有一個流程:org/activiti/expenseProcess.bpmn20.xml, 該流程定義有一個流程key=expense. 以下遵循流程定義圖片的命名規範(按照這個特定順序):
    • 如果在部署時一個圖片資源已經存在,是BPMN2.0的XML文件名,後面是流程定義的key並且是一個圖片的後綴.那麼該圖片將被使用.
      • 應該是org/activiti/expenseProcess.expense.png(或者jpg/gif).如果在一個BPMN2.0 XML文件中定義多個流程定義圖片,這種方式更有意義.每個流程定義圖片的文件名中都將會有一個流程定義key
    • 如果並沒有這樣的圖片存在,部署的時候尋找與匹配BPMN2.0 XML文件的名稱的圖片資源
      • 應該是org/activiti/expenseProcess.png.注意:這意味着在同一個BPMN2.0 XML文件夾中的每個流程定義都會有相同的流程定義圖片.因此,在每一個BPMN 2.0 XML文件夾中僅僅只有一個流程定義,這絕對是不會有問題的
  • 使用編程式的部署方式:
repositoryService.createDeployment()
  .name("expense-process.bar")
  .addClasspathResource("org/activiti/expenseProcess.bpmn20.xml")
  .addClasspathResource("org/activiti/expenseProcess.png")
  .deploy();
  • 接下來,可以通過API來獲取流程定義圖片資源:
 ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
                                                         .processDefinitionKey("expense")
                                                         .singleResult();

  String diagramResourceName = processDefinition.getDiagramResourceName();
  InputStream imageStream = repositoryService.getResourceAsStream(processDefinition.getDeploymentId(), diagramResourceName);

自動生成流程圖片

  • 在部署的情況下沒有提供圖片,如果流程定義中包含必要的’圖像交換’信息時,Activiti流程引擎會自動生成一個圖像
  • 該資源可以按照上面部署時提供流程圖片完全相同的方式獲取:

  • 如果因爲某種原因,在部署的時候,並不需要或者不必要生成流程定義圖片,那麼就需要在流程引擎配置的屬性中使用isCreateDiagramOnDeploy進行配置就可以不生成流程定義圖片:
<property name="createDiagramOnDeploy" value="false" />

類別

  • 部署和流程定義都是用戶定義的類別
  • 流程定義類別在BPMN文件中屬性的初始化的值:
<definitions ... targetNamespace="yourCategory" ... />
  • 部署類別是可以直接使用API進行指定:
repositoryService
    .createDeployment()
    .category("yourCategory")
    ...
    .deploy();

 

點擊關注,第一時間瞭解華爲雲新鮮技術~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章