Activiti异常:There is no getter for property named ‘limitBefore‘完美解决!

There is no getter for property named ‘limitBefore’

工作需求, 使用了activit工作流, 项目使用的是springboot(2.1.1.RELEASE)项目, 所以使用springboot对activit进行集成, 我是用了activit 5.23.0的版本进行集成, 集成如下:

导入activiti的依赖

 
    org.activiti
    activiti-spring-boot-starter-basic
    5.23.0

springboot yml文件进行配置

...
spring:
  activiti:
    database-schema-update: true
    check-process-definitions: false
    history-level: full
    db-history-used: true
...

上面的配置说明很简单, 这里不多做赘述, 百度即可

然后就可以对activit进行开发和使用了, 开发和使用这里不做说明, 在开发和使用过程中, 发现activit工作流不时的就会报错, 异常信息如下:

...
...
Caused by: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'limitBefore' in 'class org.activiti.engine.impl.db.ListQueryParameterObject'
...
2021-06-02 14:04:03.291 [Thread-6] ERROR org.activiti.engine.impl.interceptor.CommandContext- Error while closing command context
org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database.  Cause: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'limitBefore' in 'class org.activiti.engine.impl.db.ListQueryParameterObject'
### Cause: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'limitBefore' in 'class org.activiti.engine.impl.db.ListQueryParameterObject'
...
...

抛出异常堆栈信息很长, 这里只截取了一部分, 但是异常基本都是如上, 说是找不到limitBefore属性的getter方法? 一旦出现这个问题, 整个工作流就不好使了, 非常头疼, 就去百度了这个问题, 有人说只要重启即可, 于是重新启动, 发现问题的确好了, 但是过了一会又出现了这个问题, 感觉事情不妙, 继续百度, 一顿"猛如虎"的操作之后, 发现百度出来的没法解决这个异常, 于是访问外网, 哎, 结果还是没有进展, 一度认为是activit版本和spingboot版本"不和谐"导致, 于是降低activiti版本, 改为了5.22.0, 测试还是有问题, 改为了5.18.0, 依然不行, 感觉不是版本问题, 这时候已经过去很长时间了(2天, 有空就找这个问题), 后来看到网上有关于activit的这样的配置:

async-executor-enabled: true
job-executor-activate: true

这些配置和job以及定时任务有关, 感觉和异常会有关系, 就改了yml配置如下:

...
spring:
  activiti:
    database-schema-update: true
    check-process-definitions: false
    history-level: full
    db-history-used: true
    async-executor-enabled: false
    job-executor-activate: false
...

很可惜呀, 结果依然没有解决, 这时候感觉自己快要放弃了, 但是!车到山前必有路, 突然今天(2021/06/04), 在日志中发现, 每次抛出这个异常之前都会有一行不起眼的另外一个异常, 如下:

ERROR com.alibaba.druid.pool.DruidDataSource- init datasource error, url: jdbc:mysql://xxx.xx.xx.xx:33306/dev?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true

进一步发现, 报出ERROR com.alibaba.druid.pool.DruidDataSource之后会有一堆数据库连接异常, 然后跟着就是activit的limitbefore的异常了, 之前也见过这些异常, 以为数据库不稳定而已, 但今天就不这么想了, 一瞬间脑子闪过, 是不是因为数据库有问题导致的呢, 于是转向数据库方面, 查询了这个异常, 发现导致这样的问题有很多原因, 但是有一个原因让我很在意, 就是MySQL(本项目用的是MySQL数据库)驱动版本和数据库版本的问题, 我就看看项目的配置, 果然! MySQL的驱动是8.0.13版本的, 但是数据库的版本通过select version()看到是5.7.21, 明显8.0版本和5.0版本, 跟网上部分说明一致, 版本"不和谐", 会出问题!


    mysql
    mysql-connector-java

没有配置, 默认继承的spingboot的版本, 查到版本是8.0.13

Activiti异常:There is no getter for property named ‘limitBefore‘完美解决!_第1张图片

数据库版本如下:
Activiti异常:There is no getter for property named ‘limitBefore‘完美解决!_第2张图片

决定试一下, 改成"和谐"版本, 于是改掉MySQL驱动的版本, 改为5.1.38的版本, 自己加上, 覆盖springboot自己的版本


    mysql
    mysql-connector-java
    5.1.38

yml文件数据库驱动的配置也要改, 原来是

com.mysql.jc.jdbc.Driver

数据库降低版本, 驱动改为如下:

com.mysql.jdbc.Driver

至于上面两种配置的区别, 依然不多说, 就是和驱动jar的版本有关系, 网上讲解详细, 不难理解.

抱着试一试的态度, 更新系统, 从1点开始, 到现在截止(16:00), 没有再出现LimitBefore这个问题了, 如果会出现, 按照之前的时间, 不会这么久, 所以感觉这个问题已经得到解决了, 最近也会持续关注日志还会不会有这个问题.

后续追踪问题

后来经过一段时间的监控,发现上面的操作不足从根上解决问题,经过日志排查,发现问题实际是在项目启动的时候,数据库还没有准备好,也就是数据源连接池没有初始化完,此时activit开始初始化,引入数据库(数据库连接池没有准备好呢),然后内部连接数据库的时候就报错了。

如何修改呢?

这里要感谢我们的运维小哥哥,他将项目启动的时候延迟了几秒钟,留足时间优先初始化数据源。

你可能感兴趣的:(activiti,#,Spring,Boot,activiti,mysql,java)