【工作流Activity和Flowable】

工作流学习文档

一、什么是工作流

将一组任务组织起来以完成某个经营过程:定义了任务的触发顺序和触发条件,每个任务可以由一个或多个软件系统完成,也可以由一个或一组人完成,还可以由一个或多个人与软件系统协作完

二、工作流的优点

工作流管理的实现带来的好处非常明显,包括提高企业经营的效率、提高企业资源的利用率,提高企业运作的灵活性和适应性、提高工作效率,关注核心业务,跟踪业务处理流程,量化业务处理效率,减少浪费,增加利润,充分利用现有计算机网络资源。工作流的实施将缩短企业的运营周期,改善内部(外部)流程,优化和合理使用资源,减少人为的错误和延误,提高劳动生产率。

三、主流工作流

  • JBPM (本文不做学习)

  • Activity

    Activiti项目是一项新的基于Apache许可的开源BPM平台,从基础开始构建,旨在提供支持新的BPMN 2.0标准。
    Activiti是一种轻量级,可嵌入的BPM引擎,而且还设计适用于可扩展的云架构。 Activiti将提供宽松的Apache许可2.0,同时促进Activiti BPM引擎和BPMN 2.0的匹配。

    作者:一名程序猿
    链接:https://www.jianshu.com/p/972613558ba1

  • Flowable(activity的分支)

    Flowable是一个使用Java编写的轻量级业务流程引擎。Flowable流程引擎可用于部署BPMN 2.0流程定义(用于定义流程的行业XML标准), 创建这些流程定义的流程实例,进行查询,访问运行中或历史的流程实例与相关数据,等等。这个章节将用一个可以在你自己的开发环境中使用的例子,逐步介绍各种概念与API。

    Flowable可以十分灵活地加入你的应用/服务/构架。可以将JAR形式发布的Flowable库加入应用或服务,来嵌入引擎。 以JAR形式发布使Flowable可以轻易加入任何Java环境:Java SE;Tomcat、Jetty或Spring之类的servlet容器;JBoss或WebSphere之类的Java EE服务器,等等。 另外,也可以使用Flowable REST API进行HTTP调用。也有许多Flowable应用(Flowable Modeler, Flowable Admin, Flowable IDM 与 Flowable Task),提供了直接可用的UI示例,可以使用流程与任务。

1、Activity工作流

  • Activity核心配置文件

    spring:
      datasource:
        name: flow_activity
        url: jdbc:mysql://localhost:3306/${spring.datasource.name}?allowMultiQueries=true&useUnicode=true&serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
        #nullCatalogMeansCurrent=true 打开自动创建表文件
        username: root
        password: 123456
    # activiti default configuration
      activiti:
        database-schema-update: true
        check-process-definitions: true
        process-definition-location-prefix: classpath:/processes/
        # 流程bpm.xml图存放位置
        #    process-definition-location-suffixes:
        #      - **.bpmn
        #      - **.bpmn20.xml
        history-level: full
    

    流程引擎启动

    public void givenBPMN_whenDeployProcess_thenDeployed() {
       //创建流程表——默认创建
       processEngine = ProcessEngines.getDefaultProcessEngine();
       RepositoryService repositoryService = processEngine.getRepositoryService();
       //部署流程
       repositoryService.createDeployment()
           .addClasspathResource("processes/oa.bpmn20.xml")
           .deploy();
       Long count = repositoryService.createProcessDefinitionQuery().count();
       assertTrue(count >= 1);
    }
    
  • Activity核心数据表解析(具体可参照https://www.devdoc.cn/activiti-table-summary.html)

    Activiti 使用到的表都是 ACT_ 开头的。表名的第二部分用两个字母表明表的用途。

    • ACT_RE_ (RE) 表示 repository 存储,包含的是静态信息,如,流程定义,流程的资源(图片,规则等)。
    • ACT_RU_ (RU) 表示 runtime 运行时,运行时的流程变量,用户任务,变量,职责(job)等运行时的数据。Activiti 只存储实例执行期间的运行时数据,当流程实例结束时,将删除这些记录。这就保证了这些运行时的表小且快。
    • ACT_HI_ (HI) 表示 history 历史数据表,包含着程执行的历史相关数据,如结束的流程实例,变量,任务,等等
    • ACT_ID_ (ID) 表示 identity 组织机构,用户记录,流程中使用到的用户和组。这些表包含标识的信息,如用户,用户组,等等。
    • ACT_GE_ (GE) 表示 general 全局通用数据及设置,各种情况都使用的数据。
  • Activity流程表

    • 1:资源库流程规则表(流程规则信息)
      1. act_re_deployment 部署信息表
      2. act_re_model 流程设计模型部署表
      3. act_re_procdef 流程定义数据表
    • 2:运行时数据库表(运行时数据表)
      1. act_ru_execution 运行时流程执行实例表
      2. act_ru_identitylink 运行时流程人员表,主要存储任务节点与参与者的相关信息
      3. act_ru_task 运行时任务节点表
      4. act_ru_variable 运行时流程变量数据表
    • 3:历史数据库表(历史信息表)
      1. act_hi_actinst 历史节点表
      2. act_hi_attachment 历史附件表
      3. act_hi_comment 历史意见表
      4. act_hi_identitylink 历史流程人员表
      5. act_hi_detail 历史详情表,提供历史变量的查询
      6. act_hi_procinst 历史流程实例表
      7. act_hi_taskinst 历史任务实例表
      8. act_hi_varinst 历史变量表
    • 4:组织机构表(组织信息表——建议自己开发一套)
      1. act_id_group 用户组信息表
      2. act_id_info 用户扩展信息表
      3. act_id_membership 用户与用户组对应信息表
      4. act_id_user 用户信息表
    • 5:通用数据表(通用全局变量——不太了解)
      1. act_ge_bytearray 二进制数据表
      2. act_ge_property 属性数据表存储整个流程引擎级别的数据,初始化表结构时,会默认插入三条记录,

    原文链接:https://blog.csdn.net/weixin_43075758/article/details/116264000

  • Activity核心架构

    activity核心架构图

    ProcessEngineConfiguration 流程引擎配置对象(配置数据库连接4个大配置和建表策略)

    ProcessEngine 流程引擎核心对象(7大接口的入口类,流程总管)

    七大接口(细节拆分,每个接口负责一部分)

    ​ 1.RepositoryService:提供一系列管理流程部署和流程定义的API。
    ​ 2.RuntimeService:在流程运行时对流程实例进行管理与控制。
    ​ 3.TaskService:对流程任务进行管理,例如任务提醒、任务完成和创建任务 等。
    ​ 4.IdentityService:提供对流程角色数据进行管理的API,这些角色数据包括用户组、用户及它们之间的关系。
    ​ 5.ManagementService:提供对流程引擎进行管理和维护的服务。
    ​ 6.HistoryService:对流程的历史数据进行操作,包括查询、删除这些历史数据。
    7.FormService:表单服务——读取自定义表单内容(activity动态表单–可通过事件进行操作,普通表单–可以绑定表单和外置表单)。详细可参照


    RepositoryService

    1.部署流程,查询流程定义和部署信息

    2.挂起、激活流程定义

    3.创建模型,获取部署的资源和流程图像


    RuntimeService12(act_ru_execution–正在执行的流程对象、act_hi_procinst–流程实例的历史表、act_ru_task–存储的流程上正在运行的节点任务、act_hi_taskinst–历史任务实例表、act_hi_actinst–历史所有经过的活动)

    RuntimeService功能

    • 1.启动流程及对流程数据的控制。

    • 2.流程实例【ProcessInstance】和执行流【Execution】查询。

    • 3.触发流程操作、接受消息和信号。

    RuntimeService启动流程及变量管理

    • 启动流程的常用方式(id,key,message)
    • 启动流程可选参数(businessKey,variables,tenantId)
    • 变量(variables)的设置和获取

    流程触发

    • 使用trigger触发ReceiveTask节点
    • 触发信号捕获事件signalEventReceived【全局触发信号】
    • 触发消息捕获事件messageEventReceived【针对流程触发消息】

    TaskService(ACT_RU_*)

    TaskService的功能

    • 对用户任务(UserTask)管理和流程控制
    • 设置用户任务(UserTask)的权限信息(拥有者、候选人、办理人)
    • 针对用户任务添加用户附件、任务评论和事件记录

    TaskService对Task管理与流程控制

    • Task对象的创建,删除
    • 查询Task、并驱动Task节点完成执行
    • Task相关参数变量(variable)设置

    IdentityService(ACT_ID_*)

    可以自定义数据表进行操作(暂不赘述)

    ManagementService

    *说明:很强很强详细参照

    • 管理服务ManagementService
    • 动态流程定义服务DynamicBpmnService(实际业务开发中很少用到)

    两个场景

    • 下一流程驳回就可以了,非要自己可以手动回退。

    • 以后遇到这些问题一定要拒绝,工作流就应该在画图前确定好整个流程,违背流程的都应该学会拒绝。

    HistoryService

    管理历史流程信息

    • 管理流程结束后的历史数据
    • 构建历史数据的查询对象
    • 根据流程实例ID删除流程历史数据

    FormService

    动态表单定义

    <startEvent activiti:initiator="applyUserId" id="start" name="start">
      <extensionElements>
        <activiti:formProperty datePattern="yyyy-MM-dd" id="startDate" name="请假开始日期" required="true" type="date"/>
        <activiti:formProperty datePattern="yyyy-MM-dd" id="endDate" name="请假结束日期" required="true" type="date"/>
        <activiti:formProperty id="reason" name="请假原因" required="true" type="string"/>
      </extensionElements>
    </startEvent>
    <userTask activiti:assignee="admin" activiti:exclusive="true" id="deptLeaderAudit" name="部门领导审批">
      <extensionElements>
        <activiti:formProperty datePattern="yyyy-MM-dd" id="startDate" name="请假开始日期" type="date" writable="false"/>
        <activiti:formProperty datePattern="yyyy-MM-dd" id="endDate" name="请假结束日期" type="date" writable="false"/>
        <activiti:formProperty id="reason" name="请假原因" type="string" writable="false"/>
        <activiti:formProperty id="deptLeaderPass" name="审批意见" required="true" type="enum">
          <activiti:value id="true" name="同意"/>
          <activiti:value id="false" name="不同意"/>
        </activiti:formProperty>
      </extensionElements>
    </userTask>
    ————————————————
    版权声明:本文为CSDN博主「jonathanzhan」的原创文章https://blog.csdn.net/whatlookingfor/article/details/52998861
    

    普通表单

    <startEvent id="begin" name="请假申请" activiti:initiator="applyUserId" activiti:formKey="/demo/leave/startForm"></startEvent>
    <userTask id="leaderAudit" name="部门经理审批" activiti:candidateGroups="test" activiti:formKey="/demo/leave/completeForm"></userTask>
    

  • Activity核心API

    • ProcessEngine

      1 )在Activiti中最核心的类,其他的类都是由他而来。

      2)产生方式。

2、FlowAble工作流3

  • FlowAble配置文件

    spring:
      datasource:
        name: flow_flowable
        url: jdbc:mysql://localhost:3306/${spring.datasource.name}?allowMultiQueries=true&useUnicode=true&serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
        username: root
        password: 123456
      # 工作流 Flowable 配置
      flowable:
        # 1. false: 默认值,Flowable 启动时,对比数据库表中保存的版本,如果不匹配。将抛出异常
        # 2. true: 启动时会对数据库中所有表进行更新操作,如果表存在,不做处理,反之,自动创建表
        # 3. create_drop: 启动时自动创建表,关闭时自动删除表
        # 4. drop_create: 启动时,删除旧表,再创建新表
        database-schema-update: true # 设置为 false,可通过 https://github.com/flowable/flowable-sql 初始化
        db-history-used: true # flowable6 默认 true 生成信息表,无需手动设置
        check-process-definitions: false # 设置为 false,禁用 /resources/processes 自动部署 BPMN XML 流程
        history-level: full # full:保存历史数据的最高级别,可保存全部流程相关细节,包括流程流转各节点参数
    

    流程引擎启动方式

    • 自动配置加载

      /**
           * 流程引擎--创建28张表(操作一次即可)
           */
      @Test
      void initProcessEngine1(){
          ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
      }
      
    • 手动配置加载

      @Test
      void initProcessEngine2() {
          ProcessEngineConfiguration cfg = new StandaloneProcessEngineConfiguration()
              .setJdbcUrl("jdbc:mysql://localhost:3306/flow_flowable?allowMultiQueries=true&useUnicode=true&serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true")
              .setJdbcUsername("root")
              .setJdbcPassword("123456")
              .setJdbcDriver("com.mysql.cj.jdbc.Driver")
              //                有了表后可以使用DB_SCHEMA_UPDATE_false
              .setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
          ProcessEngine processEngine = cfg.buildProcessEngine();
          System.out.println("初始化Flowable——创建数据表");
          processEngine = ProcessEngines.getDefaultProcessEngine();
          Deployment deployment = repositoryService.createDeployment()
              .addClasspathResource("processes/holiday.bpmn20.xml")
              .deploy();
          //查询部署成功的流程
          ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
              .deploymentId(deployment.getId())
              .singleResult();
          System.out.println("Found process definition : " + processDefinition.getName());
          Map<String, Object> variables = new HashMap<String, Object>();
          variables.put("employee", "校长");
          variables.put("nrOfHolidays", 11);
          variables.put("description", "请假");
          ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("holiday",variables);
          System.out.println("启动流程实例成功");
      }*
      
  • Flowable核心数据表(跟activity类似)

    • ACT_RE_: 'RE’代表repository。带有这个前缀的表包含“静态”信息,例如流程定义与流程资源(图片、规则等)。

    • ACT_RU_: 'RU’代表runtime。这些表存储运行时信息,例如流程实例(process instance)、用户任务(user task)、变量(variable)、作业(job)等。Flowable只在流程实例运行中保存运行时数据,并在流程实例结束时删除记录。这样保证运行时表小和快。

    • ACT_HI_*: 'HI’代表history。这些表存储历史数据,例如已完成的流程实例、变量、任务等。

    • ACT_GE_***: 通用数据。在多处使用。

    • ACT_CMMN_*:CMMN的整合表

    • ACT_APP_*:数据流压缩包通过http请求发布到task模块

    • ACT_DMN_*:决策表数据

      数据表详情链接:https://blog.csdn.net/qq_42277412/article/details/121830797

  • Flowable核心架构

Flowable核心架构图

ProcessEngineConfiguration 流程引擎配置对象(配置数据库连接4个大配置和建表策略)

ProcessEngine 流程引擎核心对象(7大接口的入口类,流程总管),ProcessEngine与服务对象都是线程安全的,因此可以在服务器中保存并共用同一个引用。

七大接口(细节拆分,每个接口负责一部分)

RepositoryService:很可能是使用Flowable引擎要用的第一个服务。这个服务提供了管理与控制部署(deployments)流程定义(process definitions)的操作。这个服务还可以:

  • 查询引擎现有的部署与流程定义。
  • 暂停或激活部署中的某些流程,或整个部署。暂停意味着不能再对它进行操作,激活刚好相反,重新使它可以操作。
  • 获取各种资源,比如部署中保存的文件,或者引擎自动生成的流程图。
  • 获取POJO版本的流程定义。它可以用Java而不是XML的方式查看流程。

RuntimeService:用于启动流程定义的新流程实例。同一时刻,一个流程定义通常有多个运行中的实例。RuntimeService也用于读取与存储流程变量。流程变量是流程实例中的数据,可以在流程的许多地方使用(例如排他网关经常使用流程变量判断流程下一步要走的路径)。RuntimeService还可以用于查询流程实例与执行(Execution)。执行也就是BPMN 2.0中 'token' 的概念。通常执行是指向流程实例当前位置的指针。最后,还可以在流程实例等待外部触发时使用RuntimeService,使流程可以继续运行。流程有许多等待状态(wait states)RuntimeService服务提供了许多操作用于“通知”流程实例:已经接收到外部触发,流程实例可以继续运行。

TaskService:

  • 查询分派给用户或组的任务
  • 创建*独立运行(standalone)*任务。这是一种没有关联到流程实例的任务。
  • 决定任务的执行用户(assignee),或者将用户通过某种方式与任务关联。
  • 认领(claim)与完成(complete)任务。认领是指某人决定成为任务的执行用户,也即他将会完成这个任务。完成任务是指“做这个任务要求的工作”,通常是填写某个表单。

IdentityService:很简单。它用于管理(创建,更新,删除,查询……)组与用户。请注意,Flowable实际上在运行时并不做任何用户检查。例如任务可以分派给任何用户,而引擎并不会验证系统中是否存在该用户。这是因为Flowable有时要与LDAP、Active Directory等服务结合使用。

FormService:可选服务。也就是说Flowable没有它也能很好地运行,而不必牺牲任何功能。这个服务引入了开始表单(start form)任务表单(task form)的概念。 开始表单是在流程实例启动前显示的表单,而任务表单是用户完成任务时显示的表单。Flowable可以在BPMN 2.0流程定义中定义这些表单。表单服务通过简单的方式暴露这些数据。再次重申,表单不一定要嵌入流程定义,因此这个服务是可选的。

HistoryService:暴露Flowable引擎收集的所有历史数据。当执行流程时,引擎会保存许多数据(可配置),例如流程实例启动时间、谁在执行哪个任务、完成任务花费的事件、每个流程实例的执行路径,等等。这个服务主要提供查询这些数据的能力。

ManagementService:通常在用Flowable编写用户应用时不需要使用。它可以读取数据库表与表原始数据的信息,也提供了对作业(job)的查询与管理操作。Flowable中很多地方都使用

作业,例如定时器(timer),异步操作(asynchronous continuation),延时暂停/激活(delayed suspension/activation)等等。后续会详细介绍这些内容。

DynamicBpmnService:可用于修改流程定义中的部分内容,而不需要重新部署它。例如可以修改流程定义中一个用户任务的办理人设置,或者修改一个服务任务中的类名。

四、Flowable中的会签工作流会签

1.会签介绍

例如:有一个任务 可能需要多人审批,审批通过的条件可能比较多样,比如五个人审批。3个人审批过了就算过了,再或者有一个人权限比较高,拥有一票否决权。 即是其余所有人都过了点了,boss点了个否定就算不过了,这种就是会签。即多人审批节点设计。

2.Flowable中会签参数配置——多实例节点

  • loopCardinality(循环基数) 设置审批实例,可以理解有多少人审批当前节点

  • flowable:assignee="${assignee}"单个审批人或多个

  • flowable:collection=“assigneeList”集合类型审批人

  • flowable:elementVariable=“assignee”审批人单元

  • isSequential=“false” 定义串行并行审批(false并行多个人同时收到审批任务、true串行,串行一个个来审批)

  • completionCondition 定义审批完成条件

    ${nrOfCompletedInstances/nrOfInstances>0.5}
    
  • nrOfCompletedInstances/nrOfInstances = 完成任务实例数

    nrOfInstances=总实例数

    nrOfCompletedInstances/nrOfInstances>0.5 超过50%通过节点审批完成

五、Flowable回退

思路:具体操作TaskService 和TaskExtMapper接口进行节点遍历回退。

参考javadocs了解服务操作与引擎API的更多信息。

细节内容补充:34



  1. 流程实例与执行流概念:在Activiti中,启动了一个流程,会创建一个流程实例(Processlnstance),每个流程实例至少会有一个执行流(Execution) 。当流程实例没有流程分支时,一般情况下只会存在一个执行流;假设流程出现两个分支,此时Activiti将会有三个执行流,第一个为原来流程的主执行流,而其余两个为子执行流。 ↩︎

  2. 流程实例和执行流对象:Processlnstance是一个接口,一个Processlnstance实例表示一个流程实例,Processlnstance实际上是执行流(Execution)的子接口,流程实例也是一个执行流。Processlnstance中有Execution没有的属性,例如流程定义和业务主键。当得到的是一个Processlnstance实例时,就将其看作一个流程实例;当得到一个Execution实例时,它就是一个执行流。流程实例与执行流的数据保存在执行表ACT_RU_EXECUTION中,对应的映射实体为ExecutionEntitylmpl。 ↩︎

  3. flowable中文文档 ↩︎ ↩︎

  4. BPMN中文补充文档 ↩︎

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Flowable是一个开源的、用于构建工作流和业务流程的框架。它提供了一套功能强大的工具和API,使得开发人员能够轻松地创建、管理和执行各种类型的工作流和业务流程。 在Flowable中,一个工作流或业务流程通常由一系列的活动(Activities)组成,这些活动代表了流程中的各个步骤或任务。Flowable提供了几种类型的活动,包括: 1. User Task(用户任务):代表需要由用户完成的任务,可以与用户界面进行交互。 2. Service Task(服务任务):代表需要执行特定服务或操作的任务,可以与外部系统进行交互。 3. Start Event(开始事件):标识流程的起始点。 4. End Event(结束事件):标识流程的结束点。 5. Exclusive Gateway(排他网关):用于根据条件进行分支和合并流程。 6. Parallel Gateway(并行网关):用于并行执行多个分支的活动。 除了这些基本的活动类型外,Flowable还支持其他类型的活动,如子流程、事件监听器等,以满足不同场景下的需求。 在Flowable中,你可以使用Java或者XML来定义工作流或业务流程,并通过Flowable API来管理和执行这些流程。Flowable提供了丰富的功能,如流程实例的启动、任务的分配和完成、流程变量的管理等,使得开发人员能够轻松地构建和管理复杂的工作流和业务流程。 总结起来,Flowable是一个功能强大的工作流和业务流程框架,通过定义和管理各种类型的活动,使得开发人员能够构建和执行复杂的流程。Flowable提供了丰富的API和工具,方便开发人员进行流程的创建、管理和执行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值