# 流程事件/引擎事件不触发问题排查与解决手册
当遇到流程/引擎事件(如回退事件、超时事件、启动事件等)不触发时,请根据您看到的具体现象,直接查阅下方对应的问题场景,按步骤操作即可。
# 问题一:回退事件不触发
现象:在回退Tab页配置了事件(如更新业务数据、发送通知),但回退操作后事件未执行。
解决步骤:
确认事件配置位置
- 回退事件:配置在回退Tab页上,改回退是指当该活动被回退的时候会触发的动作。
如下图,从人工活动2回退到人工活动1时,触发人工活动1 回退Tab页中设置的触发事件。
![人工活动]()
- 回退事件:配置在回退Tab页上,改回退是指当该活动被回退的时候会触发的动作。
如下图,从人工活动2回退到人工活动1时,触发人工活动1 回退Tab页中设置的触发事件。
检查事件类型选择
- 事件类型选择:
- EOS服务:微服务版必须选此项
- 事件类型选择:
查看日志确认是否触发
常见原因及处理
- 类型选错:微服务版选了逻辑流 → 改为EOS服务
- 事件未保存:重新保存流程定义
# 问题二:活动引擎事件中超时、提醒事件未触发
现象:活动引擎事件中超时、提醒事件未触发,查看bps日志有发现401接口认证问题。
原因分析: 引擎事件中有关于超时、提醒的事件是在工作项或活动创建时通过注册定时任务实现超时提醒。定时任务触发时属于新线程触发逻辑,线程上下文中不带token认证信息,所以会报认证失败问题。 解决方案: 在application-bps.properties添加应用信息实现免登录模式。
#clientId为应用租户id/应用code 例:sys_tenant/AFCENTER
afc.simulate.login.clientId=
afc.simulate.login.sercet=
解释说明:
afc.simulate.login.clientId 为应用租户id/应用code 例如:sys_tenant/AFCENTER
afc.simulate.login.sercet为应用OAuth2认证密钥,如下图

# 问题三:超时事件不触发
现象:配置了超时提醒或超时后自动处理,但超时后事件未执行。
解决步骤:
检查超时配置
- 位置:人工活动节点 → 高级 → 超时设置
- 确认:
- 超时时间是否正确(如:2小时、1天)
- 是否勾选“启用超时”
- 是否选择了工作日历
检查工作日历配置
-- 查询工作日历 SELECT * FROM WFBIZ_CALENDAR WHERE CALENDARID = '你的日历ID'; SELECT * FROM WFBIZ_CALENDAR_DETAIL WHERE CALENDARID = '你的日历ID';确认超时计算规则
- 自然时间:24小时制
- 工作日历:排除非工作日(需配置节假日)
时区及时间设置
- 检查服务器时间及时区设置,业务应用、BPS、浏览器所在服务器的时间要一致
检查超时扫描线程是否运行
# bps/config/bps.properties bps.timeout.scanner.enabled=true bps.timeout.scanner.interval=60000 # 1分钟扫描一次
# 问题四:启动事件不触发
现象:流程启动时配置的事件(如初始化数据)未执行。
解决步骤:
确认事件配置位置
- 启动事件可配置在:
- 流程全局:流程空白处双击 → 事件 → 启动前/启动后
- 开始节点:开始节点 → 事件 → 启动后
- 启动事件可配置在:
检查事件执行日志
常见原因
- 微服务版误选逻辑流:必须选EOS服务
- 逻辑流不存在:确认逻辑流是否发布
- 参数传递错误:检查入参格式
验证逻辑流是否可独立执行
- 在开发中心单独调试该逻辑流
- 确认输入输出参数正确
检查事件执行顺序
- 启动前事件:在流程实例创建前执行
- 启动后事件:在流程实例创建后执行
# 问题五:完成事件不触发
现象:工作项完成后配置的事件未执行。
解决步骤:
确认事件配置位置
- 人工活动节点 → 事件 → 完成前/完成后
- 自动活动节点 → 事件 → 完成后
检查工作项是否真的完成了
SELECT STATE FROM WFWORKITEM WHERE WORKITEMID = 你的工作项ID; -- STATE=8 才算完成常见原因
- 异步问题:完成事件是异步执行的,可能有延迟
- 事务问题:事件在事务提交后执行,如果事务回滚则不会触发
配置异步执行(推荐)
# application.properties bps.event.async.enabled=true bps.event.async.threadPoolSize=10相关补丁
- PLATFORM_8.3.3_BPS_20250710_P1(完成事件补丁)
# 问题六:全局事件不触发
现象:配置了流程全局事件(如任何节点完成后都执行),但未触发。
解决步骤:
确认全局事件配置位置
- 流程空白处双击 → 事件 → 全局事件
- 可选事件类型:
- 流程启动后
- 流程终止后
- 任何节点完成后
- 任何工作项创建后
检查事件作用范围
- 全局事件会对所有节点生效
- 如果节点上配置了同名事件,节点事件优先
查看全局事件日志
grep "GlobalEvent" bps.log grep "TriggerEventListener" bps.log扩展开发配置(如果需要自定义)
// 1. 实现TriggerEventListener接口 public class MyGlobalEventListener implements TriggerEventListener { @Override public void onTrigger(TriggerEvent event) { // 处理逻辑 } } // 2. 在META-INF/services/中注册 // 文件:com.primeton.workflow.engine.scheduler.spi.TriggerEventListener
# 问题七:事件中获取不到流程变量
现象:事件逻辑流中想获取流程实例ID、工作项ID等,但值为空。
解决步骤:
- 事件中可用的内置变量
| 变量名 | 含义 | 可用事件 |
|---|---|---|
thisProcessInst | 流程实例对象 | 所有事件 |
thisActivityInst | 活动实例对象 | 活动相关事件 |
thisWorkItem | 工作项对象 | 工作项相关事件 |
__bfp_entity | 表单数据 | 人工活动事件 |
获取流程实例ID示例
// 逻辑流中获取 def processInstId = thisProcessInst/processInstID // 或通过上下文 def processInstId = context.get("processInstID")获取表单数据示例
// 获取表单字段值 def fieldValue = __bfp_entity/表单字段名调试输出变量值
// 添加日志输出 logger.info("processInstId: {}", thisProcessInst/processInstID) logger.info("activityDefId: {}", thisActivityInst/activityDefID)常见问题
- 变量名拼写错误:注意大小写
- 事件时机不对:有些变量在事件触发时可能还未生成
# 问题八:事件执行超时或报错
现象:事件触发了但执行失败,或导致流程提交卡住。
解决步骤:
查看事件执行日志
常见错误及处理
| 错误信息 | 原因 | 解决方案 |
|---|---|---|
SocketTimeoutException | 调用外部接口超时 | 增加超时时间,或改为异步 |
NullPointerException | 变量为空 | 添加空值判断 |
ClassNotFoundException | 类不存在 | 检查jar包是否放对位置 |
Transaction rolled back | 事务回滚 | 检查数据库操作 |
改为异步执行(推荐)
# 事件调用方式配置 bps.event.sync.execute=false # 改为异步 bps.event.async.retry.count=3 # 失败重试次数添加异常处理
// 逻辑流中添加try-catch try { // 业务逻辑 } catch (Exception e) { logger.error("事件执行失败", e) // 记录错误,但不影响流程 context.set("eventError", e.getMessage()) }设置事件超时时间
# application.properties bps.event.sync.timeout=30000 # 同步事件超时30秒 bps.event.async.timeout=60000 # 异步事件超时60秒
# 问题九:同一节点上配置了多个事件,但只执行了第一个
现象:在同一个节点上配置了多个事件(如两个完成事件),但只有第一个执行。
解决步骤:
事件执行顺序
- 同一类型的多个事件,按配置顺序依次执行
- 如果第一个事件失败,后续可能不会执行
检查事件配置
- 确保每个事件都正确保存
- 事件之间不要有依赖关系
合并多个事件
// 在一个逻辑流中调用多个服务 service1.execute(param) service2.execute(param) service3.execute(param)
# 快速排查清单(事件专用)
| 问题现象 | 可能原因 | 快速操作 |
|---|---|---|
| 回退事件不触发 | 事件配错位置 | 配在被回退节点上,不是按钮上 |
| 超时事件不触发 | 扫描未开启 | 检查bps.timeout.scanner.enabled=true |
| 启动事件不触发 | 类型选错 | 微服务版必须选EOS服务 |
| 完成事件不触发 | 事务未提交 | 改为异步执行 |
| 全局事件不触发 | 被节点事件覆盖 | 节点上不要配同名事件 |
| EOS服务调用404 | URL错误 | 用系统变量动态配置 |
| 获取不到变量 | 变量名错误 | 检查大小写和路径 |
| 事件执行超时 | 外部接口慢 | 改为异步,增加超时时间 |
| 多个事件只执行一个 | 顺序执行 | 合并到一个逻辑流 |
| 移动端事件不触发 | 版本低 | 打移动端补丁 |
# 常用配置参数
# 事件相关配置(application.properties)
# 同步/异步设置
bps.event.sync.execute=false # 改为异步执行
bps.event.async.threadPoolSize=10 # 异步线程池大小
bps.event.async.retry.count=3 # 失败重试次数
# 超时设置
bps.event.sync.timeout=30000 # 同步事件超时(毫秒)
bps.event.async.timeout=60000 # 异步事件超时(毫秒)
# 超时扫描设置
bps.timeout.scanner.enabled=true # 开启超时扫描
bps.timeout.scanner.interval=60000 # 扫描间隔(毫秒)
# 日志级别(调试用)
logging.level.com.primeton.workflow.engine.event=DEBUG
如遇到未覆盖的问题,请提供:
- 事件类型(回退/超时/启动等)
- 配置截图
- bps.log中相关日志
- 版本信息
