Activiti 流程引擎(一)

文章目录

1.Activiti 流程设计器集成与使用

(1)使用 Eclipse 集成 Activiti 流程设计器

下载插件

百度云链接: https://pan.baidu.com/s/1uVbckVTD_puqf0G7x5PXpg 密码:2rbm

解压并放到 Eclipse 目录下

  1. Eclipse 插件安装方法

Eclipse 插件安装 4 种方法
https://cloud.tencent.com/developer/article/1332826

Eclipse 使用 dropins 的插件安装方式
https://blog.csdn.net/mafly008/article/details/11093549

  1. 安装 activiti-designer-5.14.1 插件
  • 将 activiti-designer-5.14.1 内的两个文件:features 和 plugins 放到 eclipse 的 dropins/activiti-designer-5.14.1 文件内
    在这里插入图片描述
  • eclipse安装activiti需装eclipse插件20170325内的四个文件放到 eclipse 根目录的 plugins 内
    在这里插入图片描述

创建 Activiti 项目

  • File -> New -> Project -> Activiti -> Activiti Project -> Next -> 输入 Project name -> Finish

设计流程

  • Project name/src/main/resources/diagrams 包用于存放设计的流程定义 XML 文件
  • diagrams下 -> New -> Other -> Activiti Diagram -> Next -> 文件名 -> Finish

以不同格式查看流程内容

  • 右击流程文件 -> Open With

打开流程属性页面

  • Window -> Show view -> Properties

(2)使用 IDEA 集成 Activiti 流程设计器

  • actiBPM 是 IDEA 中的 Activiti 插件,用于提供可视化流程设计能力。

2.流程组件介绍

https://wenku.baidu.com/view/e0f7ce06de36a32d7375a417866fb84ae45cc33e.html

(1)事件

空启动事件

必须⼈⼯去启动⼀个流程。每启动⼀次,产⽣⼀个新的流程实例。只能通过API调⽤startProcessInstanceByXXX⽅法启动⼀个流程实例。⼤多数流程都是以此⽅式开始的,⽅便⽤户⼿动发起流程实例。

定时器启动事件

定时器启动事件⽤于在给定的时间点创建流程实例。可⽤在只启动⼀次的流程中,也可在特定时间间隔下启动。模型⼀旦部署,将会⾃动调度计时器时间,不需要通过API调⽤startProcessInstanceByXXX来启动流程实例,但还是可以通过API调⽤startProcessInstanceByXXX来再次启动。

结束事件

(2)活动列表

用户活动

⽤于对需要由⼈⼯参与者完成的⼯作建模。当流程执⾏到达这样⼀个⽤户任务时,将在分配给该任务的⽤户或组的任务列表中创建⼀个新任务。

代理人 assignee

处理人唯一

<userTask id="usertask1" name="商务采购" activiti:assignee="${assignee}" ></userTask>
候选人 candidateUsers

处理人多个,字符串以" , "分隔

<userTask id="usertask2" name="商务采购" activiti:candidateUsers="${candidateUsers}"> </userTask>
候选组 candidateGroups

在act_id_group中存储的组id

<userTask id="usertask3" name="商务采购" activiti:candidateGroups="${candidateGroups}"> </userTask>

服务任务

⽤于调⽤外部 Java 类。当下⼀个节点需要⾃动执⾏⼀些操作,并且这个节点不需要任何的⼈⼯⼲涉。操作主要步骤分为:设计流程、编写委托类、把委托类设置到流程的监听类上⾯。

脚本任务

⼀般是⽤在当前的监听器或者监听服务类都不能满⾜的情形下。

邮件任务

Activiti允许通过向⼀个或多个收件⼈发送电⼦邮件的⾃动邮件。

(3)顺序流

  • 顺序流是连接两个流程节点的连线。
  • 顺序流可以在编排流程时控制流程的执行顺序,流程执行完一个节点后,会沿着节点所有外出顺序流继续流转。
  • 顺序流在 BPMN 2.0 中的行为默认是并发的:多条外出顺序流会创造多条单独的并发流程分支。
  • 顺序流主要分为两类:标准顺序流和条件顺序流。如果节点有多条外出顺序流,可以将其中一条顺序流设置为默认顺序流。

标准顺序流

  • 标准顺序流是最常见的顺序流,连接流程内的各个元素(如事件、活动和网关等)​,表示元素间的执行顺序。
  • 标准顺序流表示为一端带有箭头的实线,从起点指向终点。
    在这里插入图片描述
  • 顺序流需要用户提供流程范围内的唯一标识(即 id)​,以及对起点与终点元素的引用。每条顺序流都有一个源头和一个目标引用,包含活动、事件或网关,其定义格式如下:这里是引用
    • 其中,sourceRef 属性值为起点元素的 id, targetRef 属性值为终点元素的 id。name 属性可以理解为顺序流的注释,将会在流程图上进行显示。注释可以让流程路线更直观和易于识别,不参与引擎规则判断。

条件顺序流

  • 我们可以为从网关、活动、事件离开的顺序流设定规则条件,使得工作流引擎在执行网关、活动的后继拆分路线时,可通过评估连线上的条件来选择路径。在标准顺序流上设置一个条件表达式(condi​t​ion expression)来决定下一步流出的目标,就构成了一个条件顺序流。
  • 当流程离开一个节点时,工作流引擎会计算其每个外出顺序流上的条件表达式,得到 boolean 类型的结果。当条件表达式的执行结果为 true 时,工作流引擎将选择该外出顺序流。当有多条顺序流被选中时,则会创建多条分支,流程会以并行方式继续流转。但需要注意,当条件顺序流搭配网关使用时,网关会用特定的方式处理顺序流上的条件,处理方式与网关类型相关
  • 使用Act​ivi​t​i Designer等插件配置条件顺序流时,往往省略起点的菱形,这使得条件顺序流的表现形式与普通顺序流相同。这种情况下,若不设置条件,则表示标准顺序流;若设置了条件,则表示条件顺序流。
    在这里插入图片描述
  • 条件顺序流定义为一个标准顺序流,包含 condi​t​ionExpression 子元素,定义格式如下:
    在这里插入图片描述
  • 由于目前 Act​ivi​t​i 只支持 tFormalExpressions,所以需要把 xsi:type=“tFormalExpression” 添加到condi​t​ionExpression 中。条件表达式放在 $ 后的大括号中,只能使用统一表达式语言(Uni​f​ied Expression Language, UEL; Java EE6规范的一部分)​,表达式的计算结果需要返回 boolean 值,否则会在解析表达式时抛出异常。
  • Act​ivi​t​i 支持两种 UEL 表达式:UEL-value 和 UEL-method。
    • ❑ UEL-value 解析为值,默认所有流程变量都可以在表达式中使用,所有 Spring bean(在Spring环境中)也可以使用在表达式中,如 ${***Bean.***Property} 等。
    • ❑ UEL-method 用于调用一个方法,可以传递参数(也可以不传递)​。传递的参数可以是字符串,也可以是表达式,它们会被自动解析。当调用一个无参数的方法时,需要在方法名后添加空括号,如 ${userBean.isEnable()}。

默认顺序流

  • 在 BPMN 2.0 规范中,所有的任务和网关都可以设置一个默认顺序流。当节点的其他外出顺序流的条件都不满足时,工作流引擎将会选择默认顺序流作为外出顺序流继续执行,此时默认顺序流的条件设置不会生效。默认顺序流表示为一条起点有一个“斜线”标记的普通顺序流。
    在这里插入图片描述
  • 默认顺序流通过对应节点的default属性定义。
    在这里插入图片描述

(4)网关

  • 网关是工作流引擎中的一个重要路径决策,可以控制流程的流向,常用于拆分或合并复杂的流程流场景。网关表示为菱形,网关内部一般会有一个小图标,用来表示网关的类型。

排它网关

  • 用于在流程流转中实现分支决策建模。排他网关需要和条件顺序流搭配使用,当流程流转到排他网关时,所有流出的顺序流都会被按顺序求解,其中第一条条件解析为 true 的顺序流会被选中(当多条顺序流程的条件为true时,只有第一条顺序流会被选中)​。此时,流程不再计算其他流出分支,而是沿着被选中的顺序流流转。
  • 如果所有顺序流条件计算结果都为 false 且该网关定义了一个默认顺序流,那么该默认顺序流将被执行。如果所有顺序流条件计算结果都为 false 且没有定义默认顺序流,则抛出异常,中断执行(在流程设计时应该避免这种情况,至少确保有一条分支的顺序流计算结果为true)​。
  • 建议为排他网关的流程分支的顺序流配置条件。未配置条件的顺序流会被计算为true。
  • 排他网关没有合并的效果,只要有一条流入的顺序流到达,该网关流出的顺序流即被激活开始执行计算。如果前置有多条正在执行的分支,排他网关之后的路径将在每条分支到达时被重复实例化。应避免这种情况的发生,除非业务需求的确如此
    在这里插入图片描述
  • 排他网关的使用示例。
    在这里插入图片描述

并行网关

  • 并行网关基于进入和外出顺序流,有分支和合并两种行为,允许将流程拆分成多个分支,或者将多个分支合并。
    • 分支即并行拆分,流程从并行网关流出后,并行网关会为所有外出顺序流分别创建一个并发分支。并行网关会忽略外出顺序流上的条件(不会解析条件)​。顺序流中即使定义了条件也会被忽略,它的每个后继分支路径都会被无条件执行。
    • 合并即并行合并,所有到达并行网关的分支路径都汇聚于此并等待,只有当所有进入顺序流的分支都到达后,流程才会通过并行网关如果其中有分支未到达或中断,那么该并行网关将一直处于等待状态
      在这里插入图片描述
  • 使用示例。
    在这里插入图片描述

包容网关

  • 包容网关可以看作排他网关和并行网关的结合体。
    • 与排他网关一样,可以在外出顺序流定义条件。与排他网关不同的是,包容网关所有条件为 true 的后继分支都会被依次执行。如果所有分支条件决策都fals且该网关定义了一条默认分支,那么该默认分支将被执行。如果没有可执行的分支,则会抛出异常​。
    • 包容网关同样包含分支和合并两种行为。所有外出顺序流的条件都会被解析,结果为 true 的顺序流会以并行方式继续执行,并为每条顺序流创建一条分支。如果后继分支都无法通过,则应合理地选择一条默认路径,否则工作流引擎执行到该网关的分支都将中断于此。合并即包容合并。所有到达包容网关的活动分支路径都汇聚于此等待,直到所有“可以到达”包容网关的分支路径全部“到达”包容网关,流程才会通过包容网关

在这里插入图片描述
在这里插入图片描述

事件网关

  • 通常网关基于连线条件决定后续路径,但事件网关有所不同,其基于事件决定后续路径。事件网关的每条外出顺序流都需要连接一个捕获中间事件。
  • 事件网关只有分支行为,流程的走向完全由中间事件决定,允许从多条候选分支中选择事件最先到达的分支(如时间事件、消息事件)​,并取消其他分支
    在这里插入图片描述
  • 一个事件网关,必须有两条或两条以上外出顺序流;
  • 事件网关后只能连接中间捕获事件类型的元素[Activiti目前不支持在事件网关后连接接收任务(receive task)]​;
  • 连接到事件网关的中间捕获事件,必须只有一个入口顺序流。
    在这里插入图片描述
  • 该流程为客户投诉处理流程。​“客户投诉”提交发起的流程执行到事件网关时,会暂停执行。与此同时,流程实例会订阅信号事件,并创建一个30分钟后触发的定时器。这使得工作流引擎等待信号事件30分钟:如果信号在30分钟内触发,则定时器会被取消,执行沿着信号继续,流转到 “一线客服处理”节点;如果30分钟内信号未被触发,执行会在定时器到时后继续,流程会沿着定时器方向流转到“二线客服处理”节点,同时取消信号订阅。

(5)结构列表

子流程

⼦流程完全是在⽗流程中定义 的(这就是为什么它通常被称为嵌⼊式⼦流程)。⼦进程只能有⼀个⽆启动事件,不允许有其他启动事件类型。⼦流程必须⾄少有⼀个end事件。BPMN 2.0规范允许省略⼦流程中的 开始和结束事件,但是当前的Activiti-5.22.0实现不⽀持这⼀点

3.Activiti 数据库设计和模型映射

Activiti 支持多种主流关系型数据库,如 DB2、MySQL、Oracle 等。Activiti 遵循以下命名规则:表名由以下划线连接的部分组成,其中第一部分固定以 ACT 开头,第二部分是表示表用途的两个字母标识,用途与服务的 API 对应,第三部分表示存储的内容。例如,ACT_HI_PROCINST 表示 Activiti 的历史流程实例表。

根据 Activiti 表的命名规则,可以将 Activiti 的数据表划分为以下 5 大类。

  • 通用数据表:用于存放流程或业务使用的通用资源数据,这类表以 ACT_GE_ 为前缀,其中 GE 表示 general。
  • 流程存储表:用于存放流程定义文件和部署信息等,这类表以 ACT_RE_ 为前缀,其中 RE 表示 repository。
  • 身份数据表:用于存放用户、组及关联关系等身份信息,这类表以 ACT_ID_ 为前缀,其中 ID 表示 identity。
  • 运行时数据表:用于存放流程执行实例、任务、变量等流程运行过程中产生的数据,这类表以 ACT_RU_ 为前缀,其中 RU 表示 runtime。
  • 历史数据表:用于存放历史流程实例、变量和任务等历史记录,这类表以 ACT_HI_ 为前缀,其中 HI表示 history。
    请添加图片描述

(1)通用数据表

  • 通用数据表指 Activiti 中以 ACT_GE_ 开头的表,用于存放流程或业务使用的通用资源数据,主要包括 ACT_GE_BYTEARRAY 资源表和 ACT_GE_PROPERTY 属性表。
    • ACT_GE_BYTEARRAY 资源表用于存储与工作流引擎相关的资源数据,Activiti 使用该资源表保存流程定义文件内容、流程图片内容和序列化流程变量等二进制数据。
    • ACT_GE_PROPERTY 属性表用于存储整个工作流引擎级别的属性数据,Activiti 将全部属性抽象为 key-value,每个属性都有相应的名称和值。

(2)流程存储表

  • 流程存储表指 Activiti 中以 ACT_RE_ 开头的表,用于存储流程定义和部署信息等,主要包括 ACT_RE_MODEL 表、ACT_RE_DEPLOYMENT 表和 ACT_RE_PROCDEF 表。
    • ACT_RE_MODEL 表即流程设计模型表,该数据表主要用于存储流程的设计模型。
    • ACT_RE_DEPLOYMENT 表即部署信息表,该表主要用于存储流程定义的部署信息。Activiti 一次部署可以添加多个资源,资源保存在 ACT_GE_BYTEARRAY 资源表中,部署信息则保存在该表中
      • ID_ 部署记录ID
      • CATEGORY_ 分类:在部署时定时,可用来对流程分类
    • ACT_RE_PROCDEF 表即流程定义数据表,该表主要用于存储流程定义信息。Activiti 部署流程时,除了将流程定义文件存储到资源表之外,还会解析流程定义文件内容,生成流程定义保存在该表中。
      • ID_ 流程定义ID

(3)身份数据表

  • 身份数据表指 Activiti 中以 ACT_ID_ 开头的表,用于存储用户、组、关系等身份信息,主要包括 ACT_ID_USER 表、ACT_ID_INFO 表、ACT_ID_GROUP 表和 ACT_ID_MEMBERSHIP 表。
    • ACT_ID_USER 表即用户表,该表主要用于存储用户基本信息数据,不是必须的。
      • ID_ 用户ID
    • ACT_ID_INFO 表即用户账号信息表,该表主要用于存储用户账号、用户信息等。Activiti 将信息分为用户、用户账号和用户信息 3 种信息类型。其中,用户保存在 ACT_ID_USER 表中,用户账号和用户信息保存在该表中
      • ID_ 账号ID
      • USER_ID 用户ID
      • PASSWORD 密码
    • ACT_ID_GROUP表即用户组表,该表主要用于存储用户组数据。
      • ID_ 用户组ID
      • NAME_ 用户组类型
    • ACT_ID_MEMBERSHIP 表即用户与用户组关系表,该表主要用于存储用户与用户组的关系,一个用户组可以有多个用户,一个用户也可以隶属于多个用户组

(4)运行时数据表

  • 指 Activiti 中以 ACT_RU_ 开头的表,用于存储流程执行实例、任务、变量等流程运行过程中产生的数据。主要包括 ACT_RU_EXECUTION 表、ACT_RU_TASK 表、ACT_RU_VARIABLE 表、ACT_RU_IDENTITYLINK 表和 ACT_RU_JOB 表等 9 张表。
    • ACT_RU_EXECUTION 表即运行时流程执行实例表。该表主要用于存储流程运行时的执行实例。流程启动时,会生成一个流程实例,以及相应的执行实例,流程实例和执行实例都存储在ACT_RU_EXECUTION表中。

      • ID_ 执行实例ID
      • PROC_INST_ID_ 流程实例ID
      • PARENT_ID_父执行实例ID
      • PROC_DEF_ID_ 流程定义ID
      • ACT_ID_ 行为ID
      • IS_ACTIVE_ 是否活跃
      • IS_SCOPE_ 是否为父作用域
      • IS_MI_ROOT_是否为根实例多执行流
      • START_TIME_ 实例开始时间 在这里插入图片描述

        执行实例ID相同的节点:
        Start,起草公文
        Sub Process
        Sub Prosess
        End,Start,经理审批,秘书盖章
        End,Start,经理审批,秘书盖章
        公文下发,End

    • ACT_RU_TASK 表即运行时任务节点表,该表主要用于存储流程运行过程中产生的任务实例数据。

      • ID_ 任务实例ID
      • EXECUTION_ID_ 执行实例ID
      • PROC_INST_ID_ 流程实例ID
      • PROC_DEF_ID_ 流程定义ID
      • NAME_ 任务实例名称
      • TASK_DEF_KEY_ 节点标识
    • ACT_RU_VARIABLE 表即运行时流程变量数据表,该表主要用于存储流程运行中的变量,包括流程实例变量、执行实例变量和任务实例变量。

      • ID_ 变量ID
      • TYPE_ 变量类型(string、integer、serializable)
      • NAME_ 变量名称
      • EXECUTION_ID_ 执行实例ID
      • PROC_INST_ID_ 流程实例ID
      • BYTEARRAY_ID_ 复杂变量存在资源表里,此处放资源ID
      • TEXT_ 字符串类型值
    • ACT_RU_IDENTITYLINK 表即运行时流程与身份关系表,该表主要用于存储运行时流程实例、任务实例与参与者之间的关系信息。

      • TYPE_ 关系类型(candidate 、participant)
      • USER_ID_ 用户ID
      • TASK_ID_ 任务ID
      • PROC_INST_ID_ 流程ID
    • ACT_RU_JOB 表即运行时作业表,该表主要用于存储Activiti正在执行的定时任务数据。

    • ACT_RU_DEADLETTER_JOB 表即运行时无法执行的作业表,该表主要用于存储Activiti无法执行的定时任务数据。

    • ACT_RU_SUSPENDED_JOB 表即运行时中断的作业表,该表主要用于存储Activiti中断的定时任务数据。

    • ACT_RU_TIMER_JOB表即运行时定时器作业表,该表主要用于存储流程运行时的定时任务数据。流程执行到中间定时器事件节点或带有边界定时器事件的节点时,会生成一个定时任务,并将相关数据存储到该表中

      • TYPE_ 定时器类型(timer)
      • EXECUTION_ID_ 执行实例ID
      • PROC_INST_ID_ 流程实例ID
      • PROC_DEF_ID_流程定义ID
      • DUEDATE_ 截止时间
      • HANDLER_TYPE_ 处理器类型(trigger-timer)
      • HANDLER_CFG_ 处理器配置({“activityId”:“boundarytimer3”})
    • ACT_RU_EVENT_SUBSCR 表即运行时事件订阅表,该表主要用于存储流程运行时的事件订阅。流程执行到事件节点时,会在该表插入事件订阅,这些事件订阅决定事件的触发。

(5)历史数据表

  • 历史数据表指 Activiti 中以 ACT_HI_ 开头的表,用于存储历史流程实例、变量和任务等历史记录。历史数据表主要包括 ACT_HI_PROCINST 表、ACT_HI_ACTINST 表、ACT_HI_TASKINST 表、ACT_HI_VARIABLE 表、ACT_HI_IDENTITYLINK 表等 8 张表。
    • ACT_HI_PROCINST 表即历史流程实例表,该表主要用于存储历史流程实例。流程启动后,保存 ACT_RU_EXECUTION 表的同时,会将流程实例写入 ACT_HI_PROCINST 表。
      • ID_ 流程实例ID
      • PROC_INST_ID_ 流程实例ID
      • PROC_DEF_ID_流程定义ID
      • START_TIME_ 流程开始时间
      • END_TIME_ 流程结束时间
      • DURATION_ 流程持续时间
      • START_ACT_ID_ 开始节点
      • END_ACT_ID_ 结束节点
    • ACT_HI_ACTINST 表即历史节点表,该表主要用于存储历史节点实例数据、记录所有流程活动实例。通过该表可以追踪最完整的流程信息。
      • ID_ 节点实例ID
      • PROC_DEF_ID_流程定义ID
      • PROC_INST_ID_ 流程实例ID
      • EXECUTION_ID_ 执行实例ID
      • ACT_ID_ 节点
      • TASK_ID_ 任务ID
      • ACT_NAME_ 节点名称
      • ACT_TYPE_ 节点类型
      • START_TIME_ 流程开始时间
      • END_TIME_ 流程结束时间
      • DURATION_ 流程持续时间
    • ACT_HI_TASKINST 表即历史任务实例表,该表与运行时任务实例表类似,用于存储历史任务实例数据。当流程执行到某个节点时,就会向该表中写入历史任务数据
    • ACT_HI_DETAIL 表即历史流程详情表,该表主要用于存储流程执行过程中的明细数据。默认情况下,Activiti不保存流程明细数据,除非将工作流引擎的历史数据配置为full。
    • ACT_HI_VARINST 表即历史变量表,该表主要用于存储历史流程的变量信息。
    • ACT_HI_IDENTITYLINK 表即历史流程与身份关系表,该表主要用于存储历史流程实例、任务实例与参与者之间的关联关系。
    • ACT_HI_COMMENT 表即历史评论表,该表主要用于存储通过TaskService添加的评论记录
    • ACT_HI_ATTACHMENT 表即历史附件表,该表主要用于存储通过任务服务TaskService添加的附件记录

4.流程操作

RepositoryService

RepositoryService是Activiti的仓库服务类。所谓的仓库指流程定义文档的两个文件:bpmn文件和流程图片

(1)流程部署

主要对应操作表:

  • act_re_deployment(部署对象表):存放流程定义的名称和部署时间,每部署一次增加一条记录。
  • act_re_procdef(流程定义表):存放流程定义的属性信息,部署每个新的流程定义都会在这张表中增加一条记录。当流程定义的key相同的情况下,使用的是版本升级
  • act_ge_bytearray(资源文件表):存储流程定义相关的部署信息。即流程定义文档的存放地。每部署一次就会增加两条记录,一条是关于bpmn规则文件的,一条是图片的,都是以二进制形式存储在数据库中。
@Configuration 
public class BPMNResourceConfig { 

@Autowired private 
RepositoryService repositoryService;

	@Bean("testDeployment") 
	public Deployment testDeployment() { 
		// DeploymentBuider属于部署层
		DeploymentBuider deploymentBuilder = repositoryService.createDeployment()
		Deployment deployment = deploymentBuilder.key("test").name("测试流程").addClasspathResource("process/testProcess.bpmn").deploy()
		log.info(deployment.getKey());   // 部署英文名:test
		log.info(deployment.getId());    // 系统生成的部署Id
		log.info(deployment.getKey());   // test
		return deployment; 
	} 
}

(2)流程定义

在启动实例时会用到流程的KEY。

@Configuration 
public class BPMNTemplateConfig { 

	@Autowired 
	private RepositoryService repositoryService;
	
	@Resource(name = "testDeployment")
	private Deployment testDeployment;
	
	@Bean("testProcessDefinition")
	public ProcessDefinition testProcessDefinition() {
		ProcessDefinitionQuery query =  repositoryService.createProcessDefinitionQuery();
		ProcessDefinition processDefinition = query.deploymentId(testDeployment.get Id()).singleResult()
		log.info(processDefinition.getKey());   // bpmn中Process的Id, 流程英文名, 如 operationIndex
		log.info(processDefinition.getId());    // operationIndex:2:38833-11vsf-1121f-12efac-12e1113
		log.info(processDefinition.getName());  // bpmn中Process的Name, 流程中文名
		log.info(processDefinition.getDeploymentId());   // 流程部署Id
		log.info(processDefinition.getResourceName());   // 资源名称, 如 process/operationIndex.bpmn
		return processDefinition;
	} 
}

(3)查询流程部署

public void testDeploymentQuery(){
    List<Deployment> myEvection = repositoryService.createDeploymentQuery()
            .processDefinitionKey(testProcessDefinition.getKey())  // 流程定义的Key
            .orderByDeploymenTime().desc()
            .list();
    for (Deployment deployment : myEvection) {
        System.out.println(deployment);
    }
}

(4)删除流程部署

public void testDeploymentQuery(){
    List<Deployment> myEvection = repositoryService.createDeploymentQuery()
            .processDefinitionKey(testProcessDefinition.getKey())  // 流程定义的Key
            .orderByDeploymenTime().desc()
            .list().get(0);
    if(myEvection != null){
    	// 普通删除, 如果当前规则下有正在执行的流程, 则抛出异常
        // repositoryService.deleteDeployment(deployment.getId());
        // 级联删除, 会删除和当前规则相关的所有信息, 正在执行的信息, 也包括历史信息
        repositoryService.deleteDeployment(myEvection.getId(), true);
    }
}

(5)流程定义挂起

某些情况可能由于流程变更需要将当前运行的流程暂停而不是直接删除,流程暂停后将不会继续执行。

repositoryService.suspendProcessDefinitionById(processDefinitionId,true,null);

(6)流程定义激活

repositoryService.activateProcessDefinitionById(processDefinitionId,true,null);

(7)获取bpmn详情(☆☆☆)

// 所有bpmn节点的信息
BpmnModel bpmnModel = repositoryService.getBpmnModel(historyTaskInfo.getProcessDefinitionId());
Collection<FlowElement> flowElements = bpmnModel.getMainProcess().getFlowElements();
Iterator<FlowElement> iterator = flowElements.iterator();
while (iterator.hasNext()) {
	FlowElement next = iterator.next(); 
	System.out.println(next.getId() + "-" + next.getName());  // startevent1-流程开启
}

// 指定bpmn中节点的信息
UserTask> userTask = (UserTask)bpmnModel.getMainProcess().getFlowElements(historyTaskInfo.getProcessDefinitionId());
log.info(userTask.getCandidateUsers(), userTask.getCandidateGroups());

RuntimeService

是activiti的流程执行服务类。可以从这个服务类中获取很多关于流程执行相关的信息。

(1)开启流程

主要对应操作表:

  • act_ru_execution:如果是用户任务节点,同时也会在act_ru_task添加一条记录。
  • act_ru_identitylink:任务参与者数据表。主要存储当前节点参与者的信息。
public String startInstance(){ 
	Map<String,Object> varMap = new HashMap<>(); 
	varMap.put("apply","A6582"); // user
	varMap.put("checkGroup", "2001");  // group
	ProcessInstance processInstance = runtimeService.startProcessInstanceById(testProcessDefinition.getId(), varMap); 
	return processInstance.getId(); 
}

(2)挂起流程实例

runtimeService.suspendProcessInstanceById(processInstanceId);

(3)激活流程实例

runtimeService.activateProcessInstanceById(processInstanceId);

(4)删除流程

runtimeService.deleteProcessInstance(processInstanceId, "删除测试");

(5)流程参数设置

https://blog.csdn.net/ITWANGBOIT/article/details/106507332

runtimeService.getVariable(processInstance.getId(), "apply");  // A6582
runtimeService.setVariable(processInstance.getId(), "apply", "A6582");
runtimeService.setVariableLocal(processInstance.getId(), "apply", "A6582"); // 只有当前子流程能拿到

TaskService

是activiti的任务服务类。可以从这个类中获取任务的信息。

(1)查询task(未处理任务☆☆☆)

Task task = taskService.createTaskQuery()
			.processInstanceId(processInstance.getId())
			.taskCandidaterOrAssigned("A6582")
			.singleResult();

(2)任务参数设置

https://blog.csdn.net/ITWANGBOIT/article/details/106544672

taskService.getVariable(task.getId(), "apply");
taskService.setVariable(task.getId(), "apply", "A6582");
taskService.setVariableLocal(task.getId(), "apply", "A6582"); // 只有当前任务能拿到

(3)完成任务

act_ru_task:对于执行完的任务,activiti将从act_ru_task表中删除该任务,下一个任务会被插入进来。

public void complete( @RequestParam(name = "userId") String userId, @RequestParam(name = "instanceId") String instanceId){ 
	Task task = taskService.createTaskQuery().processInstanceId(instanceId).taskCandidateOrAssig ned(userId).singleResult(); 
	taskService.complete(task.getId()); 
	taskService.addComment(task.getId(), instanceId, comment); 
	List<Comment> com = taskService.getTaskComment(task.getId()); 
}

HistoryService

https://www.jianshu.com/p/9b1ea194da13

是activiti的查询历史信息的类。在一个流程执行完成后,这个对象为我们提供查询历史信息。

createHistoricProcessInstanceQuery 当前、已结束的流程实例信息

historyService.createHistoricProcessInstanceQuery()
  .finished()
  .processDefinitionId("XXX")
  .list();

createHistoricActivityInstanceQuery 流程节点执行信息

historyService.createHistoricActivityInstanceQuery()
  .finished()
  .processInstanceId("XXX")
  .list();

createHistoricVariableInstanceQuery 流程或任务变量

historyService.createHistoricVariableInstanceQuery()
  .processInstanceId("XXX")
  .list();

createHistoricTaskInstanceQuery 当前、已完成、已删除任务实例信息(历史节点☆☆☆)

list<HistoricTaskInstance> list = historyService.createHistoricTaskInstanceQuery()
  .processInstanceId("XXX").list();
list.forEach(historyTaskInfo -> {
	log.info(historyTaskInfo.getName());  // 节点名称
	log.info(historyTaskInfo.getId());  // 任务Id
	log.info(historyTaskInfo.getStartTime());  // 开始时间
	log.info(historyTaskInfo.getEndTime());  // 结束时间
	log.info(historyTaskInfo.getDeleteReason());   // 删除原因
	log.info("处理人");
	log.info("部门");
})

5.监听器

https://blog.csdn.net/sadoshi/article/details/104698749/

(1)任务监听器

顾名思义是监听任务的。任务监听器的生命周期如下图所示,会经历assignment、create、
complete、delete。当流程引擎触发这四种事件类型时,对应的任务监听器会捕获其事件类型,再按照
监听器的处理逻辑进行处理。

public class MyTaskListener implements TaskListener{
 
	public void notify(DelegateTask delegateTask) {
		String eventName = delegateTask.getEventName();
		if ("create".endswith(eventName)) {
		}
		if ("complete".endswith(eventName)) {
		}
	}

在这里插入图片描述

(2)执行监听器

监听流程的所有节点和连线。主要有start、end、take事件。其中节点有start、end两种
事件,而连线则有take事件。

public class MyExecutionListener implements ExecutionListener {
 
	public void notify(DelegateExecution execution) throws Exception {
		String eventName = execution.getEventName();
		if ("start".endswith(eventName)) {
		}
		if ("end".endswith(eventName)) {
		}
	}

下图是执行监听器的生命周期:
在这里插入图片描述
在插件中Listeners指定监听器的代码位置(org.activiti.engine.delegate.DelegateExecution)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值