flowable工作流適配KingbaseES V8
阿新 • • 發佈:2020-08-13
目前,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);