千家信息网

扩展activiti删除ACT_HI_*历史表报错怎么解决

发表于:2025-02-23 作者:千家信息网编辑
千家信息网最后更新 2025年02月23日,今天小编给大家分享一下扩展activiti删除ACT_HI_*历史表报错怎么解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇
千家信息网最后更新 2025年02月23日扩展activiti删除ACT_HI_*历史表报错怎么解决

今天小编给大家分享一下扩展activiti删除ACT_HI_*历史表报错怎么解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

activiti自带了很多表,如图:

ACT_HI_*:HI表示历史数据(History)表,包括过期的流程实例,过期的变量和过期的任务等。

历史表中没有创建外键,可以很好的控制历史表。

在项目中,有可能不需要保存历史记录,也就是这些ACT_HI_*表可以删除了。

删除ACT_HI_*历史表,重新启动项目后报错:

严重: Error while closing command contextorg.activiti.engine.ActivitiException: Activiti database problem: Tables missing for component(s) history        at org.activiti.engine.impl.db.DbSqlSession.dbSchemaCheckVersion(DbSqlSession.java:713)        at org.activiti.engine.impl.db.DbSqlSession.performSchemaOperationsProcessEngineBuild(DbSqlSession.java:1097)        at org.activiti.engine.impl.SchemaOperationsProcessEngineBuild.execute(SchemaOperationsProcessEngineBuild.java:27)        at org.activiti.engine.impl.interceptor.CommandExecutorImpl.execute(CommandExecutorImpl.java:24)        at org.activiti.engine.impl.interceptor.CommandContextInterceptor.execute(CommandContextInterceptor.java:60)        at org.activiti.engine.impl.interceptor.LogInterceptor.execute(LogInterceptor.java:32)        at org.activiti.engine.impl.ProcessEngineImpl.(ProcessEngineImpl.java:75)        at org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl.buildProcessEngine(ProcessEngineConfigurationImpl.java:311)        at org.activiti.engine.ProcessEngines.buildProcessEngine(ProcessEngines.java:194)        at org.activiti.engine.ProcessEngines.initProcessEnginFromResource(ProcessEngines.java:167)        at org.activiti.engine.ProcessEngines.init(ProcessEngines.java:98)

定位到错误地方:DbSqlSession.java

 if (dbSqlSessionFactory.isDbHistoryUsed() && !isHistoryTablePresent()) {        errorMessage = addMissingComponent(errorMessage, "history");      }

这里主要的工作是检查数据库中是否有历史表,因为上面删除了数据库中的历史表所以报错了。


这里面有一个很重要的变量dbSqlSessionFactory.isDbHistoryUsed() ,从代码上面的意思也就是可以关闭使用历史表,好吧,就在创建配置文件的时候把它设置成false。

 ProcessEngineConfiguration configuration = ProcessEngineConfiguration                                    .createProcessEngineConfigurationFromResourceDefault();                  if(configuration instanceof ProcessEngineConfigurationImpl){                          //这里的主要作用是为了,删除历史数据,在启动的时候不去检测历史数据库是否存在                         ((ProcessEngineConfigurationImpl) configuration).setDbHistoryUsed(false);                  }                  ProcessEngine processEngine = configuration.buildProcessEngine();

重新启动后还是有问题,后来debug跟进去发现在使用:

ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

使用上面代码获取引擎的时候又一次去加载配置文件了,搞了半天,才发现:

ProcessEngines.getDefaultProcessEngine()获取默认的activiti引擎,首先会根据字段isInitialized判断是否已经加载了activiti配置文件,如果没有加载就去加载activiti.cfg.xml和activiti-context.xml,如果加载了,就在processEngines根据名称在获取相应的引擎。

使用 configuration.buildProcessEngine()创建activiti引擎的时候,加载了activiti配置文件,然后把创建的引擎添加到了工具类ProcessEngines的processEngines中。并没有设置字段isInitialized。

所以在项目中使用 ProcessEngines.getDefaultProcessEngine()获取默认的activiti引擎时候,第一次还会去加载配置文件信息。

这个怎么解决呢?

后来想到activiti.cfg.xml中的配置信息需要加载到ProcessEngineConfigurationImpl中,应该是先解析,然后寻找相应属性的set方法进行赋值啊(我猜的)。那就通过配置文件设置吧:

启动后项目,成功了,不在报错了。

以上就是"扩展activiti删除ACT_HI_*历史表报错怎么解决"这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注行业资讯频道。

历史 配置 引擎 文件 数据 时候 知识 篇文章 数据库 项目 表报 也就是 代码 信息 内容 历史数据 变量 字段 面的 不同 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 水星服务器苹果手机怎么设置 数据库中入库检查内容 魔兽世界怀旧服自动战斗服务器 怎样在ug 读入数据库 宇捷网络技术有限公司怎么样 数据库查询最近一周显示数据 只做期货软件开发违法 贺州学院网络安全 戴尔服务器r420灯闪 高中 网络技术应用分册 描述性医院网络安全句子 个人服务器 安全 北京神经元网络技术有限公司招聘 面向对象软件开发过程 网络安全发展综述 中国学术期刊综合评价数据库 数据库自动化测试工具 网络安全和数据安全责任制度 合肥细节互联网科技有限公司 数据库建模逻辑模型和物理模型 贵州电脑服务器托管虚拟主机 服务器市场未来 玉林市财政局网络安全设备购置 服务器图片服饰图片 鲤城区众神软件开发公司 数据库乘号怎么表示 国网绵阳供电公网络安全 bbs数据库 老旧手机做服务器 云开发数据库表为什么很少
0