flowable 达梦迁移
This commit is contained in:
@@ -8,17 +8,25 @@ import com.zt.plat.module.bpm.framework.flowable.core.event.BpmProcessInstanceEv
|
||||
import com.zt.plat.module.system.api.user.AdminUserApi;
|
||||
import org.flowable.common.engine.api.delegate.FlowableFunctionDelegate;
|
||||
import org.flowable.common.engine.api.delegate.event.FlowableEventListener;
|
||||
import org.flowable.engine.ProcessEngineConfiguration;
|
||||
import org.flowable.spring.SpringProcessEngineConfiguration;
|
||||
import org.flowable.spring.boot.EngineConfigurationConfigurer;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.ObjectProvider;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
|
||||
import org.springframework.context.ApplicationEventPublisher;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.core.task.AsyncListenableTaskExecutor;
|
||||
import org.springframework.jdbc.datasource.DataSourceUtils;
|
||||
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
|
||||
|
||||
import java.util.List;
|
||||
import javax.sql.DataSource;
|
||||
import java.sql.Connection;
|
||||
import java.sql.DatabaseMetaData;
|
||||
import java.sql.SQLException;
|
||||
|
||||
/**
|
||||
* BPM 模块的 Flowable 配置类
|
||||
@@ -28,6 +36,8 @@ import java.util.List;
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
public class BpmFlowableConfiguration {
|
||||
|
||||
private static final Logger log = LoggerFactory.getLogger(BpmFlowableConfiguration.class);
|
||||
|
||||
/**
|
||||
* 参考 {@link org.flowable.spring.boot.FlowableJobConfiguration} 类,创建对应的 AsyncListenableTaskExecutor Bean
|
||||
*
|
||||
@@ -69,6 +79,37 @@ public class BpmFlowableConfiguration {
|
||||
};
|
||||
}
|
||||
|
||||
@Bean
|
||||
public EngineConfigurationConfigurer<SpringProcessEngineConfiguration> dmProcessEngineConfigurationConfigurer(DataSource dataSource) {
|
||||
return configuration -> {
|
||||
try {
|
||||
configureDmCompatibility(configuration, dataSource);
|
||||
} catch (SQLException ex) {
|
||||
log.warn("Failed to inspect datasource for DM compatibility; Flowable will keep default settings", ex);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
private void configureDmCompatibility(SpringProcessEngineConfiguration configuration, DataSource dataSource) throws SQLException {
|
||||
Connection connection = null;
|
||||
try {
|
||||
connection = DataSourceUtils.getConnection(dataSource);
|
||||
DatabaseMetaData metaData = connection.getMetaData();
|
||||
String productName = metaData.getDatabaseProductName();
|
||||
String jdbcUrl = metaData.getURL();
|
||||
boolean dmProduct = productName != null && productName.toLowerCase().contains("dm");
|
||||
boolean dmUrl = jdbcUrl != null && jdbcUrl.toLowerCase().startsWith("jdbc:dm");
|
||||
if (!dmProduct && !dmUrl) {
|
||||
return;
|
||||
}
|
||||
log.info("Detected DM database (product='{}'); enabling Flowable Oracle compatibility with automatic schema updates", productName);
|
||||
configuration.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
|
||||
configuration.setDatabaseType("oracle");
|
||||
} finally {
|
||||
DataSourceUtils.releaseConnection(connection, dataSource);
|
||||
}
|
||||
}
|
||||
|
||||
// =========== 审批人相关的 Bean ==========
|
||||
|
||||
@Bean
|
||||
|
||||
@@ -8,6 +8,7 @@ package liquibase.database.core;
|
||||
import java.lang.reflect.Method;
|
||||
import java.sql.CallableStatement;
|
||||
import java.sql.Connection;
|
||||
import java.sql.DatabaseMetaData;
|
||||
import java.sql.PreparedStatement;
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
@@ -114,6 +115,7 @@ public class DmDatabase extends AbstractJdbcDatabase {
|
||||
public void setConnection(DatabaseConnection conn) {
|
||||
this.reservedWords.addAll(Arrays.asList("GROUP", "USER", "SESSION", "PASSWORD", "RESOURCE", "START", "SIZE", "UID", "DESC", "ORDER"));
|
||||
Connection sqlConn = null;
|
||||
boolean dmDatabase = false;
|
||||
if (!(conn instanceof OfflineConnection)) {
|
||||
try {
|
||||
if (conn instanceof JdbcConnection) {
|
||||
@@ -140,26 +142,42 @@ public class DmDatabase extends AbstractJdbcDatabase {
|
||||
Scope.getCurrentScope().getLog(this.getClass()).info("Could not set remarks reporting on OracleDatabase: " + e.getMessage());
|
||||
}
|
||||
|
||||
CallableStatement statement = null;
|
||||
|
||||
try {
|
||||
statement = sqlConn.prepareCall("{call DBMS_UTILITY.DB_VERSION(?,?)}");
|
||||
statement.registerOutParameter(1, 12);
|
||||
statement.registerOutParameter(2, 12);
|
||||
statement.execute();
|
||||
String compatibleVersion = statement.getString(2);
|
||||
if (compatibleVersion != null) {
|
||||
Matcher majorVersionMatcher = VERSION_PATTERN.matcher(compatibleVersion);
|
||||
if (majorVersionMatcher.matches()) {
|
||||
this.databaseMajorVersion = Integer.valueOf(majorVersionMatcher.group(1));
|
||||
this.databaseMinorVersion = Integer.valueOf(majorVersionMatcher.group(2));
|
||||
DatabaseMetaData metaData = sqlConn.getMetaData();
|
||||
if (metaData != null) {
|
||||
String productName = metaData.getDatabaseProductName();
|
||||
dmDatabase = productName != null && PRODUCT_NAME.equalsIgnoreCase(productName);
|
||||
if (dmDatabase) {
|
||||
this.databaseMajorVersion = metaData.getDatabaseMajorVersion();
|
||||
this.databaseMinorVersion = metaData.getDatabaseMinorVersion();
|
||||
}
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
String message = "Cannot read from DBMS_UTILITY.DB_VERSION: " + e.getMessage();
|
||||
Scope.getCurrentScope().getLog(this.getClass()).info("Could not set check compatibility mode on OracleDatabase, assuming not running in any sort of compatibility mode: " + message);
|
||||
} finally {
|
||||
JdbcUtil.closeStatement(statement);
|
||||
Scope.getCurrentScope().getLog(this.getClass()).info("Unable to inspect database metadata for DM version detection: " + e.getMessage());
|
||||
}
|
||||
|
||||
if (!dmDatabase) {
|
||||
CallableStatement statement = null;
|
||||
|
||||
try {
|
||||
statement = sqlConn.prepareCall("{call DBMS_UTILITY.DB_VERSION(?,?)}");
|
||||
statement.registerOutParameter(1, 12);
|
||||
statement.registerOutParameter(2, 12);
|
||||
statement.execute();
|
||||
String compatibleVersion = statement.getString(2);
|
||||
if (compatibleVersion != null) {
|
||||
Matcher majorVersionMatcher = VERSION_PATTERN.matcher(compatibleVersion);
|
||||
if (majorVersionMatcher.matches()) {
|
||||
this.databaseMajorVersion = Integer.valueOf(majorVersionMatcher.group(1));
|
||||
this.databaseMinorVersion = Integer.valueOf(majorVersionMatcher.group(2));
|
||||
}
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
String message = "Cannot read from DBMS_UTILITY.DB_VERSION: " + e.getMessage();
|
||||
Scope.getCurrentScope().getLog(this.getClass()).info("Could not set check compatibility mode on OracleDatabase, assuming not running in any sort of compatibility mode: " + message);
|
||||
} finally {
|
||||
JdbcUtil.closeStatement(statement);
|
||||
}
|
||||
}
|
||||
|
||||
if (GlobalConfiguration.DDL_LOCK_TIMEOUT.getCurrentValue() != null) {
|
||||
@@ -266,7 +284,15 @@ public class DmDatabase extends AbstractJdbcDatabase {
|
||||
}
|
||||
|
||||
public boolean isCorrectDatabaseImplementation(DatabaseConnection conn) throws DatabaseException {
|
||||
return "oracle".equalsIgnoreCase(conn.getDatabaseProductName());
|
||||
String databaseProductName = conn == null ? null : conn.getDatabaseProductName();
|
||||
if (databaseProductName == null) {
|
||||
return false;
|
||||
}
|
||||
if (PRODUCT_NAME.equalsIgnoreCase(databaseProductName)) {
|
||||
return true;
|
||||
}
|
||||
// Flowable 历史上将 DM 映射为 Oracle 元数据,因此这里同样接受 Oracle 以保持兼容
|
||||
return "oracle".equalsIgnoreCase(databaseProductName);
|
||||
}
|
||||
|
||||
public String getDefaultDriver(String url) {
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
package liquibase.datatype.core;
|
||||
|
||||
import liquibase.database.Database;
|
||||
import liquibase.database.core.DmDatabase;
|
||||
import liquibase.datatype.DataTypeInfo;
|
||||
import liquibase.datatype.DatabaseDataType;
|
||||
|
||||
@DataTypeInfo(
|
||||
name = "boolean",
|
||||
aliases = {"java.sql.Types.BOOLEAN", "java.lang.Boolean", "bit", "bool"},
|
||||
minParameters = 0,
|
||||
maxParameters = 0,
|
||||
priority = 2
|
||||
)
|
||||
public class DmBooleanType extends BooleanType {
|
||||
|
||||
@Override
|
||||
public boolean supports(Database database) {
|
||||
if (database instanceof DmDatabase) {
|
||||
return true;
|
||||
}
|
||||
return super.supports(database);
|
||||
}
|
||||
|
||||
@Override
|
||||
public DatabaseDataType toDatabaseDataType(Database database) {
|
||||
if (database instanceof DmDatabase) {
|
||||
return new DatabaseDataType("NUMBER", 1);
|
||||
}
|
||||
return super.toDatabaseDataType(database);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user