Commit 058223f3a425c514e8dae13a95e161d2696a48c0

Authored by YunaiV
1 parent df3438dd

feat: 支持神通数据库 Quartz 与 Flowable

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");
... ...