如果你要解决以下问题,本文可能会对你有所帮助
- activiti7相关知识,如接口分类、表功能等
- bpmn2.0 相关组件功能
- 若依集成Activiti7
- 作者遇到的Activiti7一些问题
- 如何在业务代码中获取
ExecutionId
1. 概述
描述
Activiti 是一个工作流引擎,可以将业务系统中复杂的业务流程抽取出来,使用建模语言(BPMN2.0)进行定义,业务系统按照预先定义的流程进行执行,实现了业务系统的业务流程由 activiti 进行管理,减少业务系统由于流程变更进行系统升级改造的工作量,从而提高系统的健壮性,同时也减少了系统开发维护成本。
BPMN文件:描述业务流程的标准化图形化表示方法(XML文件),包含了业务流程中的各种元素,如任务、网关、事件等
Activiti 支持 BPMN 2.0 标准,因此可以解析和执行符合 BPMN 2.0 标准的 BPMN 文件,通过将 BPMN 文件部署到 Activiti 引擎中,您可以实现业务流程的自动化执行、监控和管理
表分类
ACT_RE_*: 'RE’表示 repository。这个前缀的表包含了流程定义和流程静态资源 (图片,规则,等等)。
ACT_RU_*: 'RU’表示 runtime。这些运行时的表,包含流程实例,任务,变量,异步任务,等运行中的数据。
Activiti 只在流程实例执行过程中保存这些数据, 在流程结束时就会删除这些记录。这样运行时表可以一直很小速度很快。
ACT_HI_*: 'HI’表示 history。这些表包含历史数据,比如历史流程实例, 变量,任务等等。
ACT_GE_*: 'GE’表示 general。通用数据, 用于不同场景下
通过 ProcessEngine 创建 Service, Service 是工作流引擎提供用于进行工作流部署、执行、管理的服务接口。
提供下面5个接口对数据进行操作
springBoot配置
Ø none: 不保存任何历史记录,可以提高系统性能;
Ø activity:保存所有的流程实例、任务、活动信息;
Ø audit:也是Activiti的默认级别,保存所有的流程实例、任务、活动、表单属性;
Ø full:最完整的历史记录,除了包含audit级别的信息之外还能保存详细,例如:流程变量。
Service
Service接口 | 说明 |
---|---|
RepositoryService | activiti 的资源管理类 |
RuntimeService | activiti 的流程运行管理类 |
TaskService | activiti 的任务管理类 |
HistoryService | activiti 的历史管理类 |
IManagerService | activiti的引擎管理类 |
25张表含义(一部分)
部分内容摘自:activiti各表的具体内容含义详解_activiti每张表的作用-CSDN博客 看他的会更详细一些
一般数据
表名 | 解释 | 通俗解释 |
---|---|---|
ACT_GE_BYTEARRAY | 通用的流程定义和流程资源 | 流程定义的时候的附属信息,如xml和png说明信息 |
ACT_GE_PROPERTY | 系统相关属性 | 属性数据表。存储这个流程引擎级别的数据。 |
流程历史记录
表名 | 解释 | 通俗解释 |
---|---|---|
ACT_HI_ACTINST | 历史的流程实例 | 历史流程流转过的所有节点的活动信息, DURATION_ 包含每个流程的处理时长 |
ACT_HI_ATTACHMENT | 历史的流程附件 | 存储上传的附件 |
ACT_HI_COMMENT | 历史的说明性信息 | |
ACT_HI_DETAIL | 历史的流程运行中的细节信息 | 流程中产生的变量详细,包括控制流程流转的变量,业务表单中填写的流程需要用到的变量等 |
ACT_HI_IDENTITYLINK | 历史的流程运行过程中用户关系 | 任务参与者数据表。主要存储历史节点参与者的信息。TYPE_ :assignee 指定一个用户为任务的执行者 ;candidate 指定一个用户或用户组为任务的候选执行者 |
ACT_HI_PROCINST | 历史的流程实例 | 历史的流程示例,已结束的都会存储在这个里面 核心表 |
ACT_HI_TASKINST | 历史的任务实例 | 历史任务流程实例信息 核心表 |
ACT_HI_VARINST | 历史的流程运行中的变量信息 | |
ACT_RE_DEPLOYMENT | 部署单元信息 | 用来存储部署时需要持久化保存下来的信息 |
流程定义表
表名 | 解释 | 通俗解释 |
---|---|---|
ACT_RE_DEPLOYMENT | 部署单元信息 | 用来存储部署时需要持久化保存下来的信息 |
ACT_RE_MODEL | 模型信息 | |
ACT_RE_PROCDEF | 已部署的流程定义 | 流程解析表,解析成功了,在该表保存一条记录。业务流程定义数据表 |
运行实例表
表名 | 解释 | 通俗解释 |
---|---|---|
ACT_RU_EVENT_SUBSCR | 运行时事件 | |
ACT_RU_EXECUTION | 运行时流程执行实例 | 我的代办任务查询表 |
ACT_RU_IDENTITYLINK | 运行时用户关系信息 | 存储当前节点参与者的信息TYPE_ :assignee 指定一个用户为任务的执行者 ;candidate 指定一个用户或用户组为任务的候选执行者 |
三个id的概念
ProcessDefinitionId(流程定义的唯一标识符)是用来区分不同流程定义的,就像是这个请假流程的身份证号码一样。
ProcessInstanceId(流程实例的唯一标识符)是当您启动一个具体的请假流程实例时生成的,就像是这个具体请假流程的身份证号码一样。
Id(当前执行实例的唯一标识符)是在流程执行过程中,表示当前正在执行的任务或节点的身份证号码。每个任务或节点都有自己独特的 ID,用于唯一标识这个执行实例的特定部分。
2. BPMN
开始事件
StartEvent(空开始事件):
通过调用runtimeService.startProcessInstanceByXXX() 启动,子流程一般使用
TimerStartEvent(定时开始事件):
指定的时间创建流程实例 只启动一次/部署之后间隔多久启动/循环启动,子流程不会使用
MessageStartEvent(消息开始事件):
消息开始事件的名称在所有已发布的流程定义中不能重复,runtimeService.startProcessInstanceByMessage()
SignalStartEvent(信号开始事件):
可以多个触发
当接收到与信号开始事件关联的信号时,流程实例将启动或继续执行
信号开始事件可以用于在流程执行过程中引发外部事件或通知其他流程实例,从而实现流程之间的协作和通信。通过Signal Start Event,流程可以响应外部系统或其他流程的信号,以触发相应的流程行为
ErrorStartEvent(错误开始事件):
触发一个事件子流程
条件开始事件
通过判断决定是否
结束事件
EndEvent(空结束事件)
表示正常结束,到达事件时不会指定抛出的结果
ErrorEndEvent(错误结束事件)
流程的当前分支就会结束,并抛出一个错误, 这个错误可以被对应的中间边界错误事件捕获。 如果找不到匹配的边界错误事件,就会抛出一个异常。
TerminateEndEvent(终止结束事件)
表示强制终止,终止结束事件表示为结束事件,具有terminateEventDefinition子元素。terminateAll属性是可选的,默认情况下为false。可以添加可选属性terminateAll。如果为true,则无论在流程定义中是否放置终止结束事件,并且无论是否处于子流程(甚至是嵌套)、(根)流程实例都将终止。
下图,如果结束会结束掉此流程内所有正在进行的任务
CancelEndEvent(取消结束事件)
取消结束事件只能与BPMN事务子流程结合使用。 当到达取消结束事件时,会抛出取消事件,它必须被取消边界事件捕获。 取消边界事件会取消事务,并触发补偿机制。
边界事件
边界事件是附加在特定任务周围的事件,用于在任务执行期间触发。它们通常与用户任务或服务任务等任务节点相关联。
边界事件可以是捕获触发事件(Catching Event)或抛出事件(Throwing Event)。
当任务执行到具有边界事件的节点时,事件会监听对应的触发类型,如果触发了边界事件,流程会根据事件定义的行为做出相应的响应。
TimerBoundaryEvent(定时边界事件):
定时边界事件就是一个暂停等待警告的时钟。当流程执行到绑定了边界事件的环节, 会启动一个定时器。 当定时器触发时(比如,一定时间之后),环节就会中断, 并沿着定时边界事件的外出连线继续执行。
ErrorBoundaryEvent(错误边界事件):
成边界错误事件, 它会捕获节点范围内抛出的错误。定义一个边界错误事件,大多用于内嵌子流程, 或调用节点,对于子流程的情况,它会为所有内部的节点创建一个作用范围。 错误是由错误结束事件抛出的。 这个错误会传递给上层作用域,直到找到一个错误事件定义向匹配的边界错误事件。当捕获了错误事件时,边界任务绑定的节点就会销毁, 也会销毁内部所有的执行分支 (比如,同步节点,内嵌子流程,等等)。 流程执行会继续沿着边界事件的外出连线继续执行。
MessageBoundaryEvent(消息边界事件):
边界消息 / 捕获事件,根据引用的消息捕获相同信息
SignalBoundaryEvent(信号边界事件):
边界信号 / 捕获事件,根据引用的消息 / 信号定义捕获相同信息。 信号边界事件,如果不指定 executionId 那就会全引擎启动调用
CancelBoundaryEvent(取消边界事件):
在事务性子流程的边界上的中间捕获取消, 或简称为边界取消事件, 当事务取消时触发。当取消边界事件触发时,首先中断当前作用域的所有执行。 然后开始补偿事务内的所有激活的补偿边界事件。 补偿是同步执行的。例如,离开事务钱,边界事务会等待补偿执行完毕。 当补偿完成后,事务子流程会沿着取消边界事务的外出连线继续执行。
CompensationBoundaryEvent(补偿边界事件):
节点边界的中间捕获补偿, 或简称为补偿边界事件, 可以用来设置一个节点的补偿处理器。补偿边界事件必须使用直接引用设置唯一的补偿处理器。补偿边界事件与其他边界事件的策略不同。 其他边界事件(比如信号边界事件)当到达关联的节点就会被激活。 离开节点时,就会挂起,对应的事件订阅也会取消。 补偿边界事件则不同。补偿边界事件在关联的节点成功完成时激活。 当补偿事件触发或对应流程实例结束时,事件订阅才会删除。
中间捕获/触发事件
TimerCatchingEvent(定时中间捕获事件)
定时中间事件作为一个监听器。当执行到达捕获事件节点, 就会启动一个定时器。 当定时器触发(比如,一段时间之后),流程就会沿着定时中间事件的外出节点继续执行。
使用 ISO 8601 格式指定持续的时间,例如使用 PT10S 表示持续10秒
例1:定义在连线上,指定时间之后走后面的步骤
例2:定义在任务上,指定时间如果任务还没被处理则走定时任务之后的步骤
注:定时不是实时的,与java定时器扫描时间有关
SignalCatchingEvent(信号中间捕获事件)
中间捕获信号事件 通过引用信号定义来捕获相同信号名称的信号。与其他事件(比如错误事件)不同,信号不会在捕获之后被消费。 如果你有两个激活的信号边界事件捕获相同的信号事件,两个边界事件都会被触发, 即便它们在不同的流程实例中。
MessageCatchingEvent(消息中间捕获事件)
捕获特定名称的消息。
SignalThrowingEvent(信号中间触发事件)
中间触发信号事件为定义的信号抛出一个信号事件。在activiti中,信号会广播到所有激活的处理器中(比如,所以捕获信号事件)。 信号可以通过同步和异步方式发布。
CompensationThrowingEvent(补偿中间触发事件)
中间触发补偿事件 可以用来触发补偿。触发补偿是指补偿可以由特定节点或包含补偿事件的作用域触发。 补偿是通过分配给节点的补偿处理器来完成的。
NoneThrowingEvent(中间触发空事件)
该事件通常用于指示过程中达到的某些状态。
任务
1、 用户任务
用户任务用来设置必须由人员完成的工作。 当流程执行到用户任务,会创建一个新任务, 并把这个新任务加入到分配人或群组的任务列表中。
2、脚本任务
脚本任务是一个自动节点,当流程到达脚本任务, 会执行对应的脚本。
执行指定java类:可以用用调用外部api操作数据
执行脚本:计算变量的值存入新变量
代理表达式:将变量替换为全限定名
连接器:连接器可以帮助脚本任务处理更复杂的逻辑,例如调用外部 API、执行数据库操作或与其他系统进行交互
3、Java服务任务
Java服务任务用来调用外部java类。
java类,表达式,代理表达式,外部,连接器
4、邮件任务
activiti强化了业务流程,支持了自动邮件任务,它可以发送邮件给一个或多个参与者, 包括支持cc, bcc, HTML内容等等
5、手工任务
手工任务定义了BPM引擎外部的任务。 用来表示工作需要某人完成,而引擎不需要知道,也没有对应的系统和UI接口。 对于引擎,手工任务是直接通过的活动, 流程到达它之后会自动向下执行。
好像没啥用,就是定义了一下,表示这块有一个任务
6、发送/接收任务
发送任务(Send Task)和接收任务(Receive Task)是两种特殊类型的任务,用于在流程中进行消息的发送和接收。这些任务允许流程实例与外部系统或其他流程实例之间进行消息交换,实现流程间的通信和协作
发送任务:
用于向外部系统或其他流程实例发送消息。当流程执行到发送任务时,它会触发一个消息事件,将消息发送给指定的接收者。接收任务:
用于接收来自外部系统或其他流程实例发送的消息。当接收任务被触发时,流程会等待接收到特定的消息后继续执行。
7、业务规则任务 (businessRuleTask)
业务规则用户用来同步执行一个或多个规则。activiti使用drools规则引擎执行业务规则。 目前,包含业务规则的.drl文件必须和流程定义一起发布,流程定义里包含了执行这些规则的业务规则任务。 意味着流程使用的所有.drl文件都必须打包在流程BAR文件里,比如任务表单
DMN:DMN 是一种用于描述和执行业务决策的标准,它提供了一种图形化的方式来建模和管理业务规则,使得业务规则的定义更加清晰和易于理解。
java类,表达式,代理表达式,外部,连接器
需要配合 SpEL 表达式 or MVEL 表达式 定义规则任务
详细见:Activiti 规则任务(businessRuleTask) - Jesai - 博客园 (cnblogs.com)
8、调用活动(子流程)任务
调用活动 外部定义,可以调用BPMN CMMN
调用子流程(展开的) 当前流程内部定义
调用子流程(折叠的) 没看懂
调用节点引用流程定义外部的一个流程,使用调用节点的主要场景是需要重用流程定义, 这个流程定义需要被很多其他流程定义调用的时候。当流程执行到调用节点,会创建一个新分支,它是到达调用节点的流程的分支。 这个分支会用来执行子流程,默认创建并行子流程,就像一个普通的流程。 上级流程会等待子流程完成,然后才会继续向下执行。
9、多实例循环任务
多实例循环特性允许你在流程中多次执行同一个任务,每次执行都使用集合中的不同元素。这种特性通常在需要重复执行相同任务的场景下非常有用,比如批量处理、审批多个条目等。
网关
1、并行网关
为每个顺序流都创建一个并发分支,直到所有进入顺序流的分支都到达
2、排他网关
条件解析一条为true的顺序流,会继续执行
3、包含网关
包含网关可以看做是排他网关和并行网关的结合体
4、基于事件网关
基于事件网关允许根据事件判断流向。网关的每个外出顺序流都要连接到一个中间捕获事件。 当流程到达一个基于事件网关,网关会进入等待状态:会暂停执行。 与此同时,会为每个外出顺序流创建相对的事件订阅。
3. 设计
优先级
taskPriority:任务(User Task)的优先级
任务优先级可以帮助流程引擎确定任务的执行顺序和重要性。
较高优先级的任务可能会在任务列表中显示得更突出,或者在流程执行时被优先处理。
jobPriority:作业(Job)的优先级
作业优先级通常用于异步任务或定时任务的执行顺序和调度。
作业引擎可以根据作业的优先级来决定作业的执行顺序和优先级。
监听器
任务监听器(Task Listener)是Activiti7中的一个重要概念,用于在任务生命周期中执行特定的操作。任务监听器可以在任务创建、任务分配、任务完成等事件发生时触发,从而执行相应的逻辑。
任务监听器可以用于执行各种操作,例如记录任务日志、发送通知、更新任务状态等。通过在任务监听器中编写逻辑,可以实现对任务生命周期的全面控制和管理。
1. 定义和用途
执行监听器(Execution Listener):
定义:执行监听器是与流程执行相关的事件监听器。它可以监听流程实例、活动节点(如开始事件、结束事件、并行网关等)和其他执行上下文的事件。
用途:用于在流程生命周期的不同阶段(如创建、完成、挂起、激活等)执行特定的操作。执行监听器可以用于记录日志、更新数据库、发送通知等。
事件类型:可以监听的事件包括 start, end, take, create, update 等。
任务监听器(Task Listener):
定义:任务监听器是专门用于任务(即用户任务)相关事件的监听器。它只在任务执行的上下文中触发。
用途:用于在任务创建、完成、分配等操作时执行特定的逻辑。任务监听器通常用于设置任务的属性、处理任务的分配、发送通知等。
事件类型:可以监听的事件包括 create, assignment, complete, delete 等。Create(创建) 任务创建事件,发生在任务创建后,所有属性被设置时。
- 事件触发时机:流程实例创建时触发。
- 事件含义:该事件在流程实例创建时触发,允许监听器在流程实例启动时执行特定的操作。
Assignment(指派) 任务指派事件,发生在将任务指派给某人时。需要注意的是,该事件在任务创建事件前执行。
- 事件触发时机:任务被指派给某个用户或组时触发。
- 事件含义:该事件在任务被指派给特定用户或组时触发,可以用于在任务分配时执行一些逻辑。
Complete(完成) 任务完成事件,发生在任务完成时,即任务数据从执行数据表删除之前。
- 事件触发时机:任务被完成时触发。
- 事件含义:该事件在任务被完成时触发,允许监听器在任务完成时执行特定的操作。
Delete(删除) 任务删除事件,发生在任务完成时,即任务数据从执行数据表删除之前。
- 事件触发时机:流程实例被删除时触发。
- 事件含义:该事件在流程实例被删除时触发,可以用于在流程实例删除时执行一些清理操作或记录日志。
2. 触发时机
执行监听器:
触发时机是与流程的执行状态相关的,可以在流程的各个阶段触发。
例如,流程开始时、结束时,或在某个活动节点被激活时。
任务监听器:
仅在任务的生命周期内触发,通常是用户任务相关的事件。
例如,当任务被创建、分配或完成时。
3. 总结
执行监听器 关注于流程的整体执行状态,适用于处理与流程实例和执行上下文相关的事件。
任务监听器 专注于用户任务的生命周期,适用于处理与任务相关的事件
若依集成Activiti项目参考
名称 | 说明 | 地址 |
---|---|---|
RuoYi-Vue-Activiti | 集成Activiti 6.x工作流版本 | https://gitee.com/smell2/ruoyi-vue-activiti |
RuoYi-Vue-Process | 闲鹿工作流版本 | https://gitee.com/calvinhwang123/RuoYi-Vue-Process |
RuoYi-Vue-Nocode | 集成Activiti7、Mongodb、Form-Making等组件的零代码版本 | https://gitee.com/atlus/ruoyi-vue-nocode |
RuoYi-Vue-Plus-Activiti | 集成的activiti工作流版本 | https://gitee.com/sgs98/RuoYi-Vue-Plus-Activiti |
4.记录一下方法与问题
顺序
定义 -> 部署 -> 实例运行
key为唯一标识
定义之后会在 act_re_deployment / act_re_procdef / act_ge_bytearray 表存储信息
任务到期时间
可以通过变量动态设置
2025-06-26T09:54:00
前端
使用bpmnjs,可以自己定制化
任务转办
taskService.delegateTask(taskId, newAssignee);
定时任务表
ACT_RU_TIMER_JOB
ACT_HI_JOB
设置历史记录的存活时间
activiti:historyTimeToLive 默认永久
设置代理人,执行人,执行组
只能设置一个默认代理人,但可设置多个候选人和候选组,通过’,'分割
可直接指定名称,也可写为变量,例如 ${name},逗号分割时也可自动识别
注意:候选人写为变量时变量就必须存在,而代理人写为变量时可以不存在
附件表
ACT_HI_ATTACHMENT 表可以存储附件 直接存储url或大文件存在 ACT_GE_BYTEARRAY 表
可以存储流程附件和任务附件
TaskListener 监听器设置候选人或组
task.addCandidateUser():设置执行人
task.addCandidateGroup():设置执行组
代理人和候选人候选组之间之间的规则
设置代理人:taskService.setAssignee(任务id,用户)
代理人(Assignee):
代理人是任务的指定处理者,具有独占的任务处理权限
当任务设置了代理人时,只有该代理人可以看到任务并处理它
其他候选人将无法看到该任务在他们的待办任务列表中
候选人(Candidate):
候选人是任务的备选处理者,可以看到任务并有机会领取任务。
当任务设置了代理人时,候选人将不会看到任务在他们的待办任务列表中。
如果代理人未处理任务或者任务重新分配,候选人可能在后续的流程中看到并领取任务。
一旦候选人成功领取任务,该任务将从其他候选人的待办任务列表中消失,只有领取任务的候选人可以处理任务。
自己能看到的任务有
自己作为代理人的任务
没有代理人时自己作为候选人的任务,需要先领取再完成,不想办理可以再归还
没有代理人时自己作为候选组的任务,需要先领取再完成,不想办理可以再归还
双路线,条件路线,排他、并行、包含 网关
双路线
会在路线集合点生成两个任务,如下图,会在d处形成两个任务
条件路线
按照条件,符合几条走几条
没有符合路线则抛出异常
排他网关
只要经过排他网关,就必须要有符合的处理路径,否则报错
只能走一条,如果符合多个条件,则走定义在前的那条
并行网关
必须全部都完成,才能到下一步
包含网关
需要会走所有的没有条件的和符合条件的
办理人申请延期,怎么设计比较合理
需求:需要在办理人申请延期的时候也可以处理任务
方案:使用不中断的消息捕获,在不影响办理人处理的同时,发送消息给审批人
遇到的问题:
想要发出消息被捕获,需要调用 runtimeService.messageEventReceived(messageName,executionId)
如何获取executionId就成了问题 后面有单独说明
5. 示例页面
审批历史
进度查看
后端直接生成png图片形式
返回已经处理的节点,任务id 正在执行的节点
定义列表
6、获取ExecutionId遇到的问题
Activiti7在业务代码中获取executionId
问题1描述:
办理人
需要在办理的同时还可以发送申请给审批人
同时
审批人
在审批的同时办理人
也可以提交给审核人
审核
问题1处理:
使用了
消息边界事件(不中断)
可以做到办理人
办理的同时审批人
还可以审批
问题2描述:
触发消息需要调用
runtimeService.messageEventReceived(messageName,executionId)
方法,但是executionId
的值获取不到
问题2处理:
分析:
获取
executionId
的值,可以有两种方法
- 通过
runtimeService.createExecutionQuery().processInstanceId(processInstanceId()).list()
方法获取当前实例的所有execution
,通过条件判断拿到executionId
- 在
执行监听器 ExecutionListener
中把DelegateExecution
的id
设置为全局变量,!!!
想法是美好的,实验中出现问题,只是走到办理人之后,只是产生了监听,并没有执行消息边界事件,所以消息边界事件没有启动,不会走执行监听器- 重新思考:使用
信号边界事件
,调用runtimeService.signalEventReceived(String signalName)
,也可以调用活动,!!!
但是,出现了问题3
方法1代码
获取
BPMN
模型对象,通过当前任务key获取边界事件的消息名称和编号,通过编号与执行实例对比拿到executionId
BpmnModel bpmnModel = repositoryService.getBpmnModel(task.getProcessDefinitionId()); // 获取流程定义的 BPMN 模型
Collection<FlowElement> flowElements = bpmnModel.getMainProcess().getFlowElements();
String messageName = null;
String boundaryEventId = null;
// 遍历流程元素,查找与任务 "aa" 相关联的边界事件
for (FlowElement flowElement : flowElements) {
if (flowElement instanceof UserTask && flowElement.getId().equals(task.getFormKey())) {
UserTask userTask = (UserTask) flowElement;
// 查找与任务 "aa" 相关联的边界事件
for (BoundaryEvent boundaryEvent : userTask.getBoundaryEvents()) {
// 原本可以有多个,但是只需要获取一个拿来
// List<String> messageNames = new ArrayList<>();
// for (EventDefinition eventDefinition : boundaryEvent.getEventDefinitions()) {
// MessageEventDefinition mEventDefinition = (MessageEventDefinition) eventDefinition;
// messageNames.add(mEventDefinition.getMessageRef());
// }
messageName = ((MessageEventDefinition) boundaryEvent.getEventDefinitions().get(0)).getMessageRef();
boundaryEventId = boundaryEvent.getId();
break; // 如果只有一个边界事件与任务相关,可以直接跳出循环
}
}
}
if (boundaryEventId != null) {
List<Execution> executionList = runtimeService.createExecutionQuery()
.processInstanceId(task.getProcessInstanceId())
.list();
String executionId = null;
// 遍历执行实例列表
for (Execution execution : executionList) {
if (execution.getActivityId() != null && execution.getActivityId().equals(boundaryEventId)) { // 这里需要替换为你的边界事件的 ID
executionId = execution.getId(); // 获取边界事件的 executionId
break; // 找到后可以退出循环
}
}
if(executionId != null){
runtimeService.messageEventReceived(messageName,executionId);
System.out.println(messageName+":"+executionId);
}
问题3描述
调用信号边界事件时,因为没有指定
executionId
,所以act_ru_event_subscr
表中所有的同名的信号都会捕获到信号开始执行
问题3处理:
在定义流程时,把信号名写成变量,在流程启动时赋随机值,我的做法是赋值为
processDefinitionId
,可在流程中随机获取,遇到问题4
问题4描述:
消息名称可以设置为变量,信号名称不能设置为变量
网络释义:消息是一种点对点通信机制,因此通常需要动态定义消息名称以便在流程中进行通信。信号通常用于广播事件,因此通常在流程定义中静态定义信号名称。如果需要动态地定义信号事件,可以考虑使用消息事件来实现类似的功能