目前,flowable支持mysql、postgreSQL、DB2、Oracle等數據庫,官方暫不支持國產數據庫KingbaseES。因項目需要,嘗試修改flowable 6.4支持KingbaseES V8,配置方法如下文。
1、數據配置
nexus私服倉庫上傳kingbaseES V8的jdbc驅動,同時配置pom文件
項目中配置數據庫連接,因為項目使用的是spring boot,配置如下:
datasource:
driver-class-name:com.kingbase8.Driver
url:jdbc:kingbase8://127.0.0.1:54321/TEST
username:SYSTEM
password:111
2、工作流引擎初始化
工作流初始化的時候會加載數據庫配置,會根據數據庫類型,加載項目下的差異化sql腳本,具體流程:org.flowable.app.engine.AppEngineConfiguration中的init方法:
protected void init() {
initEngineConfigurations();
initConfigurators();
configuratorsBeforeInit();
initCommandContextFactory();
initTransactionContextFactory();
initCommandExecutors();
initIdGenerator();
initExpressionManager();
if (usingRelationalDatabase) {
initDataSource();
}
if (usingRelationalDatabase || usingSchemaMgmt) {
initSchemaManager();
initSchemaManagementCommand();
}
initVariableTypes();
initBeans();
initTransactionFactory();
if (usingRelationalDatabase) {
initSqlSessionFactory();
}
initSessionFactories();
initServices();
initDataManagers();
initEntityManagers();
initDeployers();
initAppDefinitionCache();
initAppResourceConverter();
initDeploymentManager();
initClock();
initIdentityLinkServiceConfiguration();
initVariableServiceConfiguration();
configuratorsAfterInit();
initBusinessCalendarManager();
}
其中initDataSource會初始化數據庫類型,調用initDatabaseType,initDatabaseType中獲取數據庫類型的方式如下
databaseType = databaseTypeMappings.getProperty(databaseProductName);
databaseTypeMappings是一個定義的Properties,存儲數據庫類型的映射,之后在initSqlSessionFactory 中調用
properties.load(getResourceAsStream(pathToEngineDbProperties()));
public String pathToEngineDbProperties() {
return "org/flowable/common/db/properties/" + databaseType + ".properties";
}
會根據數據庫的類型查找具體的配置文件,然后加載進initMybatisConfiguration的配置,而配置文件中的寫的就是具體的分頁方式,如下是mysql.properties文件的內容
limitAfter=LIMIT #{maxResults} OFFSET #{firstResult}
金倉的分頁方式和mysql的一樣,所以我們之后可以共用
3、更改代碼適配金倉
如上分析我們只需要增加一個金倉的映射,並把映射的值設置為與mysql一致
在org.flowable.common.engine.impl.AbstractEngineConfiguration中添加如下代碼
public static final String DATABASE_TYPE_KINGBASEES = "mysql";
在getDefaultDatabaseTypeMappings映射中添加
databaseTypeMappings.setProperty("KingbaseES", DATABASE_TYPE_KINGBASEES);