zoukankan      html  css  js  c++  java
  • 工作流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),将报告发送给每一个投资人。

    • 等等。

  • 相关阅读:
    libxml2 解析文档的例子
    FreeRTOS之任务优先级的分配
    idea中快速重写父类方法
    组件里面调用组建的方法
    sproot 注解学习记录 (含给实现类起名字的方法)
    直播技术没有那么神秘,你也可以DIY
    Java服务端API接口统一加密和解密
    把对象交给spring管理的3种方法及经典应用
    Dart空安全的底层原理与适配
    Dart 中 final和const 区别
  • 原文地址:https://www.cnblogs.com/longsanshi/p/12700946.html
Copyright © 2011-2022 走看看