天天看點

項目中工作流部署詳細解析!Spring中部署Activiti流程定義的三種姿勢業務文檔外部資源流程定義的版本提供流程圖檔自動生成流程圖檔類别

業務文檔

  • 為了部署流程,需要包裝在一個業務文檔中
    • 一個業務文檔是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:
項目中工作流部署詳細解析!Spring中部署Activiti流程定義的三種姿勢業務文檔外部資源流程定義的版本提供流程圖檔自動生成流程圖檔類别

外部資源

  • 流程定義儲存在Activiti所支援的資料庫中
  • 當使用服務任務,執行監聽器
  • 從Activiti配置檔案中配置的Spring beans時,流程定義能夠引用這些委托類.
  • 這些類或者Spring配置檔案對于所有流程引擎中可能執行的流程定義必須是可用的

Java類

  • 當流程執行個體被啟動的時候,在流程中被使用的所有自定義類應該存在流程引擎的類路徑下:
    • 服務任務中:
      • JavaDelegates
      • 事件監聽器
      • 任務監聽器
    • 在部署業務文檔時,這些類不必都存在于類路徑下.當使用Ant部署一個新的業務文檔時,意味着你的委托類不必存在類路徑下
  • 當使用示例設定添加自定義類:
    • 應該添加包含自定義類的jar包到activiti-explorer控制台
    • activiti-rest的webapp 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,name和id:
    • 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 key name version
myProcess:1:676 myProcess My important process 1
  • 假設部署用一個流程的最新版本号(改變使用者任務),但是流程定義的id保持不變.流程定義表将包含以下清單資訊:
myProcess:2:870 2

當runtimeService.startProcessInstanceByKey("myProcess") 方法被調用時,它将會使用流程定義版本号為2的, 因為這是最新版本的流程定義.可以說每次流程定義建立流程執行個體時,都會預設使用最新版本的流程定義

  • 建立第二個流程,在Activiti中,定義并且部署它,該流程定義會添加到流程定義表中:
<definitions id="myNewDefinitions" >
  <process id="myNewProcess" name="My important process" >
    ...           
  • 表結構如下所示:
myNewProcess:1:1033 myNewProcess
  • 注意: 新流程的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流程引擎會自動生成一個圖像
  • 該資源可以按照上面部署時提供流程圖檔完全相同的方式擷取:
項目中工作流部署詳細解析!Spring中部署Activiti流程定義的三種姿勢業務文檔外部資源流程定義的版本提供流程圖檔自動生成流程圖檔類别
  • 如果因為某種原因,在部署的時候,并不需要或者不必要生成流程定義圖檔,那麼就需要在流程引擎配置的屬性中使用isCreateDiagramOnDeploy進行配置就可以不生成流程定義圖檔:
<property name="createDiagramOnDeploy" value="false" />           

類别

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