工作流flowable官方文檔閱讀筆記2


官方文檔:https://tkjohn.github.io/flowable-userguide/#bpmnFirstExampleDiagram

亂翻一通,翻玩了一遍。好像什么都不懂。第二遍,尋找能讓我理解的地方。

正文開始:

主要章節如圖:

 

 一下是自己的理解

文檔流程如下

1.要解決的需求

用例很簡單:有一個公司,叫做BPMCorp。在BPMCorp中,由會計部門負責,每月需要為投資人撰寫一份報告。在報告完成后,需要高層經理中的一人進行審核,然后才能發給所有投資人

2.一個XML文件定義了流程。至於怎么定義,有工具。

<definitions id="definitions"
  targetNamespace="http://flowable.org/bpmn20"
  xmlns:flowable="http://flowable.org/bpmn"
  xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL">

    <process id="financialReport" name="Monthly financial report reminder process">

      <startEvent id="theStart" />

      <sequenceFlow id="flow1" sourceRef="theStart" targetRef="writeReportTask" />

      <userTask id="writeReportTask" name="Write monthly financial report" >
        <documentation>
          Write monthly financial report for publication to shareholders.
        </documentation>
        <potentialOwner>
          <resourceAssignmentExpression>
            <formalExpression>accountancy</formalExpression>
          </resourceAssignmentExpression>
        </potentialOwner>
      </userTask>

      <sequenceFlow id="flow2" sourceRef="writeReportTask" targetRef="verifyReportTask" />

      <userTask id="verifyReportTask" name="Verify monthly financial report" >
        <documentation>
          Verify monthly financial report composed by the accountancy department.
          This financial report is going to be sent to all the company shareholders.
        </documentation>
        <potentialOwner>
          <resourceAssignmentExpression>
            <formalExpression>management</formalExpression>
          </resourceAssignmentExpression>
        </potentialOwner>
      </userTask>

      <sequenceFlow id="flow3" sourceRef="verifyReportTask" targetRef="theEnd" />

      <endEvent id="theEnd" />

    </process>

</definitions>

 

 

3.部署和啟動流程實例(部署XML到工作流引擎)

我們只是得到了一個XML,和工作流引起並沒有聯系起來。得到的XML我們可以理解為流程定義(definition,感覺有點spring的感覺)。然后要得到流程實例,我們需要將這個XML(definition)部署。主要包括兩步:

  • 流程定義將會存儲在Flowable引擎配置的持久化數據庫中。因此部署業務流程保證了引擎在重啟后也能找到流程定義。

  • BPMN 2.0流程XML會解析為內存中的對象模型,供Flowable API使用。

更多關於部署的信息可以在部署章節中找到。

部署代碼:

Deployment deployment = repositoryService.createDeployment()
  .addClasspathResource("FinancialReportProcess.bpmn20.xml")
  .deploy();

然后我們就可以獲得實例了:financialReport是xml中的id的值,在工作流中叫key

ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("financialReport");

官方給的一個demo:

public static void main(String[] args) {

  // 創建Flowable流程引擎
  ProcessEngine processEngine = ProcessEngineConfiguration
    .createStandaloneProcessEngineConfiguration()
    .buildProcessEngine();

  // 獲取Flowable服務
  RepositoryService repositoryService = processEngine.getRepositoryService();
  RuntimeService runtimeService = processEngine.getRuntimeService();

  // 部署流程定義
  repositoryService.createDeployment()
    .addClasspathResource("FinancialReportProcess.bpmn20.xml")
    .deploy();

  // 啟動流程實例
  runtimeService.startProcessInstanceByKey("financialReport");
}

4.執行任務。

實例啟動之后,所屬第一個任務組accountancy成員都可以看到這個任務,如果其中一個人申領任務,任務組的其他成員就看不到了。

然后完成任務

taskService.complete(task.getId());

然后流程會到第二個任務,和第一個任務一樣的處理。

完整代碼:

這段代碼考慮到了你可能已經使用Flowable UI應用啟動了一些流程實例。代碼中總是獲取任務列表而不是一個任務

public class TenMinuteTutorial {

  public static void main(String[] args) {

    // 創建Flowable流程引擎
    ProcessEngine processEngine = ProcessEngineConfiguration
      .createStandaloneProcessEngineConfiguration()
      .buildProcessEngine();

    // 獲取Flowable服務
    RepositoryService repositoryService = processEngine.getRepositoryService();
    RuntimeService runtimeService = processEngine.getRuntimeService();

    // 部署流程定義
    repositoryService.createDeployment()
      .addClasspathResource("FinancialReportProcess.bpmn20.xml")
      .deploy();

    // 啟動流程實例
    String procId = runtimeService.startProcessInstanceByKey("financialReport").getId();

    // 獲取第一個任務
    TaskService taskService = processEngine.getTaskService();
    List<Task> tasks = taskService.createTaskQuery().taskCandidateGroup("accountancy").list();
    for (Task task : tasks) {
      System.out.println("Following task is available for accountancy group: " + task.getName());

      // 申領任務
      taskService.claim(task.getId(), "fozzie");
    }

    // 驗證Fozzie獲取了任務
    tasks = taskService.createTaskQuery().taskAssignee("fozzie").list();
    for (Task task : tasks) {
      System.out.println("Task for fozzie: " + task.getName());

      // 完成任務
      taskService.complete(task.getId());
    }

    System.out.println("Number of tasks for fozzie: "
            + taskService.createTaskQuery().taskAssignee("fozzie").count());

    // 獲取並申領第二個任務
    tasks = taskService.createTaskQuery().taskCandidateGroup("management").list();
    for (Task task : tasks) {
      System.out.println("Following task is available for management group: " + task.getName());
      taskService.claim(task.getId(), "kermit");
    }

    // 完成第二個任務並結束流程
    for (Task task : tasks) {
      taskService.complete(task.getId());
    }

    // 驗證流程已經結束
    HistoryService historyService = processEngine.getHistoryService();
    HistoricProcessInstance historicProcessInstance =
      historyService.createHistoricProcessInstanceQuery().processInstanceId(procId).singleResult();
    System.out.println("Process instance end time: " + historicProcessInstance.getEndTime());
  }

}

 總結:

        定義工作流(xml)-----》運行工作流實例(通過部署)------》啟動工作流實例-----》執行任務(申領)-----》完成

 后續:

可以看出這個業務流程太簡單了,不能實際使用。但只要繼續學習Flowable中可用的BPMN 2.0結構,就可以通過以下元素增強業務流程:

  • 定義網關(gateway)使經理可以選擇:駁回財務報告,並重新為會計師創建任務;或者接受報告。

  • 定義並使用變量(variables)存儲或引用報告,並可以在表單中顯示它。

  • 在流程結束處定義服務任務(service task),將報告發送給每一個投資人。

  • 等等。

 


免責聲明!

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



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