Commit 058223f3a425c514e8dae13a95e161d2696a48c0
1 parent
df3438dd
feat: 支持神通数据库 Quartz 与 Flowable
Showing
4 changed files
with
41 additions
and
13 deletions
README.md
| ... | ... | @@ -67,12 +67,12 @@ |
| 67 | 67 | |----------|-----------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------| |
| 68 | 68 | | 国产操作系统 | 银河麒麟、统信 UOS 等 Linux 系统 | 参考 [《Linux 部署》](https://doc.iocoder.cn/deployment-linux/),选择与 CPU 架构匹配的 JDK | |
| 69 | 69 | | 关系型数据库 | MySQL、MariaDB、Oracle、PostgreSQL、SQL Server | 默认使用 MySQL | |
| 70 | -| 国产关系型数据库 | 达梦 DM、人大金仓 KingbaseES、openGauss、瀚高 HighGo、OceanBase、TiDB、华为 GaussDB、云和恩墨 MogDB、海量 Vastbase G100、PolarDB、神通 | 参考 [《国产信创数据库》](https://doc.iocoder.cn/xinchuang-db/)。GaussDB、MogDB、Vastbase G100 使用 PG 兼容模式;神通已支持普通 CRUD、代码生成,详见 [神通数据库](https://doc.iocoder.cn/xinchuang-db/#_9-神通数据库) | | |
| 71 | -| 国产缓存 | 东方通 TongRDS、宝兰德 BES CacheDB | 替换 Redis,参考 [《国产信创数据库》](https://doc.iocoder.cn/xinchuang-db/)。BES CacheDB 提供接入说明,待介质验证 | | |
| 72 | -| 国产应用服务器 | 东方通 TongWeb、宝兰德 BES AppServer | 替换 Tomcat,参考 [《东方通服务器部署》](https://doc.iocoder.cn/deployment-tong/)、[《宝兰德服务器部署》](https://doc.iocoder.cn/deployment-bes/)。BES AppServer 提供接入说明,待介质验证 | | |
| 70 | +| 国产关系型数据库 | 达梦 DM、人大金仓 KingbaseES、openGauss、瀚高 HighGo、OceanBase、TiDB、华为 GaussDB、云和恩墨 MogDB、海量 Vastbase G100、PolarDB、神通 | 参考 [《国产信创数据库》](https://doc.iocoder.cn/xinchuang-db/) | | |
| 71 | +| 国产缓存 | 东方通 TongRDS、宝兰德 BES CacheDB | 替换 Redis,参考 [《国产信创数据库》](https://doc.iocoder.cn/xinchuang-db/) | | |
| 72 | +| 国产应用服务器 | 东方通 TongWeb、宝兰德 BES AppServer | 替换 Tomcat,参考 [《东方通服务器部署》](https://doc.iocoder.cn/deployment-tong/)、[《宝兰德服务器部署》](https://doc.iocoder.cn/deployment-bes/) | | |
| 73 | 73 | | 国产 Web 服务器 | 东方通 TongHttpServer | 替换 Nginx,提供静态资源、反向代理,参考 [《东方通服务器部署》](https://doc.iocoder.cn/deployment-tong/) | |
| 74 | 74 | |
| 75 | -* 数据库脚本:[`sql`](sql/) 目录提供 MySQL、Oracle、PostgreSQL、SQL Server、达梦、人大金仓、openGauss、瀚高、OceanBase 的项目初始化脚本(含 Quartz),优先使用对应目录;MariaDB、TiDB 直接使用 MySQL 脚本;GaussDB、MogDB、Vastbase G100 基于 openGauss 脚本导入,PolarDB PostgreSQL 版直接使用 PostgreSQL 脚本;神通需按 [文档](https://doc.iocoder.cn/xinchuang-db/#_9-神通数据库) 调整 openGauss 项目脚本后导入 | |
| 75 | +* 数据库脚本:[`sql`](sql/) 目录提供 MySQL、Oracle、PostgreSQL、SQL Server、达梦、人大金仓、openGauss、瀚高、OceanBase 的项目初始化脚本(含 Quartz),优先使用对应目录;MariaDB、TiDB 直接使用 MySQL 脚本;GaussDB、MogDB、Vastbase G100 基于 openGauss 脚本导入,PolarDB PostgreSQL 版直接使用 PostgreSQL 脚本;神通需按 [文档](https://doc.iocoder.cn/xinchuang-db/#_9-神通数据库) 调整 openGauss 项目脚本(含 Quartz)后导入 | |
| 76 | 76 | * 其它数据库、后续表结构变更,可参考 [`sql/tools`](sql/tools/README.md) 的转换工具及 [《表结构变更(版本升级)》](https://doc.iocoder.cn/sql-update/#_3-数据库转换),转换后仍需按实际数据库调整、测试 |
| 77 | 77 | |
| 78 | 78 | ## 🐳 项目关系 | ... | ... |
sql/tools/README.md
| ... | ... | @@ -235,7 +235,13 @@ sed -e '/^-- Table structure for dual$/,/^-- @formatter:on$/d' -e 's/varchar(102 |
| 235 | 235 | ALTER TABLE system_menu ALTER COLUMN id SET DEFAULT nextval('system_menu_seq'); |
| 236 | 236 | ``` |
| 237 | 237 | |
| 238 | -> 注意:神通暂未适配 Quartz,不需要导入 `sql/opengauss/quartz.sql`;`application-local.yaml` 默认排除了 Quartz 的自动配置,保持不变即可。 | |
| 238 | +如需使用 Quartz 定时任务,再以该账号执行 Quartz 的临时脚本:只将 `bytea` 字段改为神通的 `BLOB`(`bytea` 字段在神通上无法读取任务数据),其余 SQL 保持不变: | |
| 239 | + | |
| 240 | +```Bash | |
| 241 | +sed 's/ bytea / BLOB /' ../opengauss/quartz.sql > /tmp/quartz-shentong.sql | |
| 242 | +``` | |
| 243 | + | |
| 244 | +> 注意:该 Quartz 脚本用于全新初始化,不支持把已有数据的 `bytea` 字段转换为 `BLOB`。Quartz 使用默认的 `StdJDBCDelegate`,不需要设置 `driverDelegateClass`,也不要开启 `useProperties`(任务参数包含 `Long` 等非字符串类型)。`application-local.yaml` 默认排除了 Quartz 的自动配置,需要使用时,从 `spring.autoconfigure.exclude` 列表中删除 `QuartzAutoConfiguration` 这一行即可;不要通过启动参数单独设置 `spring.autoconfigure.exclude`,否则会覆盖整个排除列表。 | |
| 239 | 245 | |
| 240 | 246 | ② 项目使用神通 JDBC 驱动(`com.oscar.Driver`),使用序列主键(复用 MyBatis Plus 的 `PostgreKeyGenerator`),分页使用 MyBatis Plus 内置的神通方言。将数据源配置中的地址、账号和密码修改为: |
| 241 | 247 | |
| ... | ... | @@ -257,6 +263,8 @@ password: 神通密码 |
| 257 | 263 | |
| 258 | 264 | > 注意:该驱动是 Maven 中央仓库上 `com.shentongdata` 发布的版本,不是神通官方下载中心的配套认证版本。项目适配时使用的是神通 7.0.14,其它版本请自行验证。 |
| 259 | 265 | |
| 266 | +③ 工作流:神通驱动返回的数据库产品名为 `OSCAR`,Flowable 无法自动识别,项目会在未设置 `flowable.database-type` 时,将其按 `oracle` 处理(使用 Flowable 内置的 Oracle 建表脚本,`BLOB`、`CLOB` 字段及大写的表名)。启用 BPM 模块后,Flowable 按默认的 `flowable.database-schema-update: true` 自动创建 Flowable 引擎的 `ACT_`、`FLW_` 表;BPM 模块的 `bpm_` 业务表不会自动创建,需要先按 [《工作流 · 功能开启》](https://doc.iocoder.cn/bpm/) 获取 BPM 的 SQL,转换为神通可以执行的 SQL(包括 `bpm_` 表对应的序列)后导入。如果显式设置了 `flowable.database-type`,以显式设置为准,神通需要设置为 `oracle`,不要设置为 `postgres`。 | |
| 267 | + | |
| 260 | 268 | ## 1.X 容器的销毁重建 |
| 261 | 269 | |
| 262 | 270 | 开发测试过程中,有时候需要创建全新干净的数据库。由于测试数据 Docker 容器采用数据卷 Volume 挂载数据库实例的数据目录,因此销毁数据需要停止容器后,删除数据卷,然后再重新创建容器。 | ... | ... |
yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/config/BpmFlowableConfiguration.java
| ... | ... | @@ -60,7 +60,7 @@ public class BpmFlowableConfiguration { |
| 60 | 60 | * |
| 61 | 61 | * 1. 设置各种监听器 |
| 62 | 62 | * 2. 设置自定义的 ActivityBehaviorFactory 实现 |
| 63 | - * 3. 设置华为 GaussDB、openGauss(含 MogDB)的数据库类型 | |
| 63 | + * 3. 设置华为 GaussDB、openGauss(含 MogDB)、神通的数据库类型 | |
| 64 | 64 | */ |
| 65 | 65 | @Bean |
| 66 | 66 | public EngineConfigurationConfigurer<SpringProcessEngineConfiguration> bpmProcessEngineConfigurationConfigurer( |
| ... | ... | @@ -74,33 +74,38 @@ public class BpmFlowableConfiguration { |
| 74 | 74 | configuration.setActivityBehaviorFactory(bpmActivityBehaviorFactory); |
| 75 | 75 | // 设置自定义的函数 |
| 76 | 76 | configuration.setCustomFlowableFunctionDelegates(ListUtil.toList(customFlowableFunctionDelegates.stream().iterator())); |
| 77 | - // 设置华为 GaussDB、openGauss(含 MogDB)的数据库类型 | |
| 78 | - initPostgreSQLCompatibleDatabaseType(configuration); | |
| 77 | + // 设置华为 GaussDB、openGauss(含 MogDB)、神通的数据库类型 | |
| 78 | + initDatabaseType(configuration); | |
| 79 | 79 | }; |
| 80 | 80 | } |
| 81 | 81 | |
| 82 | 82 | /** |
| 83 | - * 以下原生驱动返回的 ProductName 不是 PostgreSQL,Flowable 无法识别,启动时会报错: | |
| 83 | + * 以下原生驱动返回的 ProductName,Flowable 无法识别,启动时会报错: | |
| 84 | 84 | * 1. 华为 GaussDB 的原生驱动(jdbc:gaussdb:),返回 GaussDB |
| 85 | 85 | * 2. org.opengauss 的 openGauss JDBC 驱动(jdbc:opengauss:),返回 openGauss,连接 MogDB 时也是如此 |
| 86 | + * 3. 神通的 JDBC 驱动(jdbc:oscar:),返回 OSCAR | |
| 86 | 87 | * |
| 87 | - * 因此,在未显式设置 databaseType 时,按 PostgreSQL 处理(需要使用 PG 兼容模式创建的数据库)。 | |
| 88 | + * 因此,在未显式设置 databaseType 时:GaussDB、openGauss 按 PostgreSQL 处理(需要使用 PG 兼容模式创建的数据库); | |
| 89 | + * 神通按 Oracle 处理,使用 BLOB、CLOB 字段及大写的表名。 | |
| 88 | 90 | * 只读取 Flowable 自身数据源的元数据,其它数据库不做处理,仍由 Flowable 自动识别 |
| 89 | 91 | * |
| 90 | 92 | * @param configuration Flowable 配置 |
| 91 | 93 | */ |
| 92 | - private static void initPostgreSQLCompatibleDatabaseType(SpringProcessEngineConfiguration configuration) { | |
| 94 | + private static void initDatabaseType(SpringProcessEngineConfiguration configuration) { | |
| 93 | 95 | if (configuration.getDatabaseType() != null || configuration.getDataSource() == null) { |
| 94 | 96 | return; |
| 95 | 97 | } |
| 96 | 98 | try (Connection connection = configuration.getDataSource().getConnection()) { |
| 97 | - if (ObjectUtils.equalsAny(connection.getMetaData().getDatabaseProductName(), | |
| 99 | + String productName = connection.getMetaData().getDatabaseProductName(); | |
| 100 | + if (ObjectUtils.equalsAny(productName, | |
| 98 | 101 | DbTypeEnum.GAUSS_DB.getProductName(), DbTypeEnum.OPENGAUSS.getProductName())) { |
| 99 | 102 | configuration.setDatabaseType(AbstractEngineConfiguration.DATABASE_TYPE_POSTGRES); |
| 103 | + } else if (DbTypeEnum.OSCAR.getProductName().equals(productName)) { | |
| 104 | + configuration.setDatabaseType(AbstractEngineConfiguration.DATABASE_TYPE_ORACLE); | |
| 100 | 105 | } |
| 101 | 106 | } catch (SQLException ex) { |
| 102 | 107 | // 获取失败时,不做处理,由 Flowable 自动识别时报错 |
| 103 | - log.warn("[initPostgreSQLCompatibleDatabaseType][获取数据库类型失败]", ex); | |
| 108 | + log.warn("[initDatabaseType][获取数据库类型失败]", ex); | |
| 104 | 109 | } |
| 105 | 110 | } |
| 106 | 111 | ... | ... |
yudao-module-bpm/src/test/java/cn/iocoder/yudao/module/bpm/framework/flowable/config/BpmFlowableConfigurationTest.java
| ... | ... | @@ -73,6 +73,21 @@ public class BpmFlowableConfigurationTest extends BaseMockitoUnitTest { |
| 73 | 73 | } |
| 74 | 74 | |
| 75 | 75 | @Test |
| 76 | + public void testBpmProcessEngineConfigurationConfigurer_oscar() throws SQLException { | |
| 77 | + // mock 方法:神通 JDBC 驱动(jdbc:oscar:)返回的 ProductName | |
| 78 | + mockDatabaseProductName("OSCAR"); | |
| 79 | + // 准备参数 | |
| 80 | + SpringProcessEngineConfiguration configuration = buildConfiguration(null); | |
| 81 | + | |
| 82 | + // 调用 | |
| 83 | + configure(configuration); | |
| 84 | + | |
| 85 | + // 断言:按 Oracle 处理,并关闭连接 | |
| 86 | + assertEquals(AbstractEngineConfiguration.DATABASE_TYPE_ORACLE, configuration.getDatabaseType()); | |
| 87 | + verify(connection).close(); | |
| 88 | + } | |
| 89 | + | |
| 90 | + @Test | |
| 76 | 91 | public void testBpmProcessEngineConfigurationConfigurer_postgreSQL() throws SQLException { |
| 77 | 92 | // mock 方法:PostgreSQL,以及 io.mogdb 的 openGauss JDBC 驱动连接 MogDB 时返回的 ProductName |
| 78 | 93 | mockDatabaseProductName("PostgreSQL"); | ... | ... |