源码分析

根据flowable中文文档的说明可知processEngine流程引擎是通过org.flowable.spring.ProcessEngineFactoryBean工厂类来创建的,因此先把目光聚集到这里

/**
* 这个方法即是生成流程引擎的方法
*/
public ProcessEngine getObject() throws Exception {this.configureExternallyManagedTransactions();if (this.processEngineConfiguration.getBeans() == null) {this.processEngineConfiguration.setBeans(new SpringBeanFactoryProxyMap(this.applicationContext));}// 显然,引擎室通过配置类的buildProcessEngine方法来创建的this.processEngine = this.processEngineConfiguration.buildProcessEngine();return this.processEngine;
}

根据上述源码,我们可以把目光转向配置类信息,先来看看配置类的继承结构

从上图中可以看出蓝色主线标识了主要过程的继承逻辑,buildProcessEngine经过AbstractEngineConfigurationProcessEngineConfigurationProcessEngineConfigurationImplSpringProcessEngineConfiguration;

通过查看3个类的buildProcessEngine的实现,可知引擎对象是先由ProcessEngineConfigurationImpl初始化后再教给SpringProcessEngineConfiguration进行扩展。那就转到ProcessEngineConfigurationImpl的源码中查看。

    // 引擎构建的初次实现public ProcessEngine buildProcessEngine() {// 初始化工作this.init();// 根据当前的配置信息初始化引擎实现ProcessEngineImpl processEngine = new ProcessEngineImpl(this);if (this.handleProcessEngineExecutorsAfterEngineCreate) {processEngine.startExecutors();}if (this.flowable5CompatibilityEnabled && this.flowable5CompatibilityHandler != null) {this.commandExecutor.execute(new Command<Void>() {public Void execute(CommandContext commandContext) {ProcessEngineConfigurationImpl.this.flowable5CompatibilityHandler.getRawProcessEngine();return null;}});}this.postProcessEngineInitialisation();return processEngine;}// init 方法太长,省略部分本次不考虑的因素public void init() {this.initEngineConfigurations();this.initConfigurators();...if (this.usingRelationalDatabase) {// 如果是关系型数据库,初始化数据源this.initDataSource();} else {this.initNonRelationalDataSource();}...}

如果仔细看过启动的异常堆栈就知道实际抛出异常的就是 this.initDataSource();这个方法了,那就点进去看看。后续源码就不一个个放了,直接看根本造成问题的AbstractEngineConfiguration.initDatabaseType()方法

// 初始化数据类型
public void initDatabaseType() {Connection connection = null;try {connection = this.dataSource.getConnection();DatabaseMetaData databaseMetaData = connection.getMetaData();// 获取到数据库名,此处是根据相应驱动中配置来获取到的值,【KingbaseES】String databaseProductName = databaseMetaData.getDatabaseProductName();...// 根据数据库名获取相应数据库类型this.databaseType = this.databaseTypeMappings.getProperty(databaseProductName);if (this.databaseType == null) {throw new FlowableException("couldn't deduct database type from database product name '" + databaseProductName + "'");}...}

看到这里基本已经看到跟堆栈最终一致的异常错误了,很明显this.databaseTypeMappings.getProperty(databaseProductName);是获取不到相应的数据库类型,因为databaseTypeMappings是由getDefaultDatabaseTypeMappings()这个静态方法构建的,所以我们的目标就是要重写这个静态方法,一种非常简单方法就是把AbstractEngineConfiguration这个类再相同路径下覆盖一遍重写的时候加上,这也是网上比较多的做法。但我有另一种新的想法。

新的实现

首先先一个类来继承SpringProcessEngineConfiguration保证他们再一个调用过程中

public class CustomEngineConfiguration extends SpringProcessEngineConfiguration {/*** 构造方法* 由于AbstractEngineConfiguration没有提供特定的方法来对databaseTypeMappings属性进行操作,* 因此就只能在构造方法中重新赋值*/public CustomEngineConfiguration(){super();super.databaseTypeMappings = extendDefaultDatabaseTypeMappings();}/*** 扩展原有的getDefaultDatabaseTypeMappings,支持人大金仓* @return*/public Properties extendDefaultDatabaseTypeMappings() {Properties databaseTypeMappings = getDefaultDatabaseTypeMappings();databaseTypeMappings.setProperty("KingbaseES", DATABASE_TYPE_POSTGRES);return databaseTypeMappings;}}

这里我们通过扩展getDefaultDatabaseTypeMappings()方法,添加了kingbase的类型支持,并将它覆盖了父类中的databaseTypeMappings属性。那么现在问题来了,怎么能让CustomEngineConfiguration被加载呢,这时候就要把目光放到自动装配上面。查看flowable的自动装配配置文件

重点就上面圈中的自动配置类,我们可以看到在该配置类中创建了SpringProcessEngineConfiguration并进行了配置,因此我们只要替换这个类并修改SpringProcessEngineConfiguration的构建方法就可以搞定了


/**
* 继承ProcessEngineAutoConfiguration保证原有功能不变
*/
@Configuration
@Primary
public class CustomProcessEngineAutoConfiguration extends ProcessEngineAutoConfiguration {public CustomProcessEngineAutoConfiguration(...) {super(...);}/*** 重写springProcessEngineConfiguration的类过程,其实整个过程都没有变* 只是在构造SpringProcessEngineConfiguration方法的时候构造的是我们自定义的配置类,添加了关于人大金仓的支持*/@SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")@Bean@Primary@Overridepublic SpringProcessEngineConfiguration springProcessEngineConfiguration(...) throws IOException {// 此处替换成构造自己定义的支持人大金仓的配置类SpringProcessEngineConfiguration conf = new CustomEngineConfiguration();...}

只需要以上两个配置类即可解决人大金仓下使用flowable时的启动问题。

新的问题

解决上述问题后我尝试在空的人大金仓数据库中生成flowable相关的表结构,但是依然抛出了异常。

flowable6.7.2在Spring boot项目中兼容人大金仓相关推荐

  1. Spring Boot整合JPA和人大金仓(Kingbase8)数据库

    Spring Boot整合JPA和人大金仓(Kingbase8)数据库 简介 在开发Java应用程序时,使用JPA(Java Persistence API)可以方便地进行数据库操作.而人大金仓(Ki ...

  2. spring boot 项目源码_Spring Boot2 系列教程(三)理解 Spring Boot 项目中的 parent

    前面和大伙聊了 Spring Boot 项目的三种创建方式,这三种创建方式,无论是哪一种,创建成功后,pom.xml 坐标文件中都有如下一段引用: <parent><groupId& ...

  3. 在Spring Boot项目中使用Spock框架

    转载:https://www.jianshu.com/p/f1e354d382cd Spock框架是基于Groovy语言的测试框架,Groovy与Java具备良好的互操作性,因此可以在Spring B ...

  4. scheduled每天下午1点执行一次_在Spring Boot项目中使用@Scheduled注解实现定时任务...

    在java开发中定时任务的实现有多种方式,jdk有自己的定时任务实现方式,很多框架也有定时任务的实现方式.这里,我介绍一种很简单的实现方式,在Spring Boot项目中使用两个注解即可实现. 在sp ...

  5. Spring Boot 项目中Java对象的字符串类型属性值转换为JSON对象的布尔类型键值的解决方法及过程

    文章目录 场景描述 示例说明 解决历程 @JsonFormat是否能解决问题? 万能方案-调试 替代方案 补充知识 Java对象与JSON对象的序列化与反序列化 相关注解说明 后记 场景描述 在Spr ...

  6. Spring Boot项目中使用RestTemplate调用https接口出现 unable to find valid certification path to requested target

    问题描述:Spring Boot项目中使用RestTemplate调用https接口出现以下错误: PKIX path building failed: sun.security.provider.c ...

  7. Spring Boot项目中集成Elasticsearch,并实现高效的搜索功能

    Spring Boot项目中集成Elasticsearch 前言 环境准备 引入依赖 配置Elasticsearch连接信息 定义实体类 定义Elasticsearch操作接口 实现搜索功能 总结 前 ...

  8. spring boot 项目中遇到的错误(tomcat 400)

    spring boot 项目 get传入的参数是 json数组的时候  会报400 原因:是因为tomcat的版本太高 https://blog.csdn.net/fxz1535567862/arti ...

  9. Spring Security是什么,以及如何在Spring Boot项目中整合Spring Security并且使用它,下面我们通过一个登录案例简单介绍一下Spring Security。

    1.什么是Spring Security? 在了解Spring Security之前,我们是不是应该先思考一个问题,我们自己写的web案例一般都需要先登录,之后登录之后才能访问其他页面,或者说我们不同 ...

最新文章

  1. 【Spark篇】---Spark初始
  2. 再谈fedora下的音乐和视频播放器的安装
  3. Re:从0开始的微服务架构--(二)快速快速体验微服务架构?--转
  4. Linux命令pdm -cli,pdm下载器下载 Persepolis Download Manager(aria2下载器) v3.1.0 Linux 官方安装免费版 下载-脚本之家...
  5. jms spring_JMS和Spring:有时很重要的小事情
  6. 怎么下载php源文件,设计了一个php下载当前文件,却把php源文件下载下来了,为何?...
  7. android studio 预览问题 :java.lang.NoClassDefFoundError: com/android/util/PropertiesMap
  8. Cognos 增加全局类
  9. apollo @value没生效_有Apollo,还用Archaius吗?
  10. Python 中常用的保留字(关键字)详解
  11. MySQL性能瓶颈以及优化
  12. 论文复现——CE-FPN: Enhancing Channel Information for Object Detection
  13. 软件测试好学吗 入门还是很好学的,但想要深造就还是要费功夫
  14. 深度学习与人脸识别系列(3)__利用caffe训练深度学习模型
  15. 【Matlab】Matlab将mat文件保存为txt文件
  16. c语言课程设计报告停车系统,停车场管理系统C语言课程设计
  17. 机器学习常见算法思想的面试宝典
  18. 用IE浏览器打开网页显示网站还原错误
  19. centos7 更新网络源,下载扩展源时出现“one of the configured repositories failed”提示,解决方案
  20. 阿里云技术专家解读 | 行业首创电商搜索模板

热门文章

  1. 音视频开发系列(65)-FFMPEG进阶系列01-ffplay命令详解
  2. Multivariate Time Series Forecasting with Dynamic Graph Neural ODEs(TKDE)
  3. 图片剪裁怎么剪裁?照片尺寸裁剪工具的使用方法
  4. 如何取消ppt中的拼写检查
  5. 数据分析如何提升对业务的理解
  6. gRPC 基于 CA 的 TLS 证书认证
  7. 使用github上的开源框架SlidingMenu环境的搭建,以及getSupportActionBar方法不能找到的问题...
  8. android.view.WindowLeaked: Activity com.xty.activity.ActivityMainPage has leaked window com.android.
  9. 乘风破浪:都30岁“老人,app架构
  10. 1. 安装Proxmox VE