HCRM博客

Activiti Rule 报错,如何有效解决并避免此类问题?

Activiti 是一个轻量级的工作流和业务流程管理(BPM)平台,广泛应用于企业应用中,在使用 Activiti 时,开发者可能会遇到各种报错问题,本文将全面分析 Activiti 报错的常见原因、解决方案及预防措施,并附上相关的FAQs。

一、Activiti 报错常见原因及解决方案

Activiti Rule 报错,如何有效解决并避免此类问题?-图1
(图片来源网络,侵权删除)

1. Unknown property used in expression

错误描述: org.activiti.engine.ActivitiException: Unknown property used in expression

原因分析:

变量传递错误:在流程定义文件中使用的表达式引用了不存在的变量。${userId} 未被正确赋值或拼写错误。

数据同步问题:部分用户信息没有同步,导致流程查询下一步处理人时查不到数据。

解决方案:

Activiti Rule 报错,如何有效解决并避免此类问题?-图2
(图片来源网络,侵权删除)

检查变量传递:确保在启动流程实例时传递的变量与流程定义中的表达式一致,使用Map<String, Object> variables 传递变量,并在流程定义中使用${variableName} 表达式。

数据同步:确保所有必要的用户信息已经同步到系统中,避免因数据缺失导致的报错。

RuntimeService runtimeService = processEngine.getRuntimeService();
Map<String, Object> variables = new HashMap<>();
variables.put("userId", "12345");
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcess", variables);

2. No outgoing sequence flow

错误描述: org.activiti.engine.ActivitiException: No outgoing sequence flow

原因分析:

缺少流转条件:在流程图中,某个节点没有明确的流转条件或下一个节点。

Activiti Rule 报错,如何有效解决并避免此类问题?-图3
(图片来源网络,侵权删除)

逻辑错误:EL表达式的逻辑错误,导致无法确定下一个节点。

解决方案:

明确流转条件:为每个节点指定明确的流转条件,使用${conditionA == true || conditionB == true} 来指定多个可能的流转路径。

调试流程图:使用 Activiti 提供的图形化工具检查流程图,确保每个节点都有明确的下一节点。

<userTask id="userTask1" name="User Task">
  <extensionElements>
    <activiti:outgoing>nullCondition="${approve == true}"/>
    <activiti:outgoing>nullCondition="${reject == true}"/>
  </extensionElements>
</userTask>

3. Transaction rolled back because it has been marked as rollbackonly

错误描述: Transaction rolled back because it has been marked as rollbackonly

原因分析:

异常未捕获:在流程执行过程中,某个操作抛出了异常,导致事务回滚。

数据库版本不一致:数据库表的版本高于引擎版本,导致空指针或其他错误。

解决方案:

捕获异常:在代码中添加异常捕获机制,确保在出现异常时进行适当的处理,而不是直接回滚事务。

数据库版本匹配:确保数据库表的版本与 Activiti 引擎版本匹配,避免因版本不一致导致的错误。

try {
    // 流程相关操作
} catch (Exception e) {
    // 异常处理逻辑
}

4. Timer 流程被卡住

错误描述: Activiti 使用了 timer,遇到了流程卡在 timer,不继续执行的问题。

原因分析:

定时任务失败:timer 触发后,由于某些原因(如异常)导致流程未能继续执行。

事务回滚:timer 触发的事务被回滚,导致流程卡住。

解决方案:

检查定时任务日志:查看act_ru_job 表中的定时任务记录,找到失败的原因并进行修复。

优化定时任务逻辑:确保定时任务的逻辑正确,避免因异常导致事务回滚。

SELECT * FROM act_ru_job;

5. JSP页面使用EL表达式引起的错误

错误描述: java.lang.NoSuchMethodError: javax.el.ExpressionFactory.getStreamELResolver()Ljavax/el/ELResolver;

原因分析:

依赖冲突:项目中存在不同版本的依赖,导致 EL 表达式解析出现问题。

解决方案:

统一依赖版本:确保项目中所有依赖的版本一致,特别是与 EL 表达式相关的依赖。

升级依赖:如果使用的是旧版本的依赖,尝试升级到最新版本以解决兼容性问题。

<dependency>
    <groupId>org.glassfish.web</groupId>
    <artifactId>elimpl</artifactId>
    <version>2.2</version>
</dependency>

二、Activiti 报错预防措施

1、规范变量命名:在流程定义和代码中统一变量命名,避免拼写错误。

2、充分测试:在部署前充分测试流程,确保所有流转条件和逻辑正确。

3、日志记录:在关键步骤添加日志记录,便于排查问题。

4、定期维护:定期检查和维护流程定义和相关数据,确保系统稳定运行。

5、培训开发人员:对开发人员进行 Activiti 使用培训,提高其对工作流引擎的理解和使用水平。

三、FAQs

Q1:如何在Activiti中传递变量?

A1:在Activiti中传递变量可以通过Map<String, Object> 的方式在启动流程实例时传递。

RuntimeService runtimeService = processEngine.getRuntimeService();
Map<String, Object> variables = new HashMap<>();
variables.put("key1", "value1");
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcess", variables);

在流程定义中使用${variableName} 表达式引用这些变量。

Q2:如何解决Activiti中的Unknown property used in expression错误?

A2:该错误的主要原因是流程定义中使用的表达式引用了不存在的变量,解决方法包括:

确保传递的变量与流程定义中的表达式一致。

检查变量名称是否正确拼写。

确保所有必要的数据已同步到系统中。

Activiti 报错问题涉及多个方面,包括变量传递、数据同步、流转条件、事务管理和依赖冲突等,通过仔细检查代码和流程定义,合理使用日志记录和异常处理机制,可以有效预防和解决这些问题,希望本文提供的信息对您有所帮助,如有进一步疑问,请参考官方文档或相关技术社区。

分享:
扫描分享到社交APP
上一篇
下一篇