Flowable源码地址:https://github.com/flowable/flowable-engine

AbstractEngineConfiguration引擎配置抽象类

public abstract class AbstractEngineConfiguration {protected final Logger logger = LoggerFactory.getLogger(getClass());/** 表示“无租户”的租户id */public static final String NO_TENANT_ID = "";/*** 在创建表单引擎时,对照库检查DB模式的版本,如果版本不匹配,则引发异常。*/public static final String DB_SCHEMA_UPDATE_FALSE = "false";public static final String DB_SCHEMA_UPDATE_CREATE = "create";public static final String DB_SCHEMA_UPDATE_CREATE_DROP = "create-drop";/*** 在创建表单引擎时创建模式,在关闭表单引擎时删除模式.*/public static final String DB_SCHEMA_UPDATE_DROP_CREATE = "drop-create";/*** 构建流程引擎后,将执行检查,并在必要时更新模式.*/public static final String DB_SCHEMA_UPDATE_TRUE = "true";protected boolean forceCloseMybatisConnectionPool = true;protected String databaseType;protected String jdbcDriver = "org.h2.Driver";protected String jdbcUrl = "jdbc:h2:tcp://localhost/~/flowable";protected String jdbcUsername = "sa";protected String jdbcPassword = "";protected String dataSourceJndiName;protected int jdbcMaxActiveConnections = 16;protected int jdbcMaxIdleConnections = 8;protected int jdbcMaxCheckoutTime;protected int jdbcMaxWaitTime;protected boolean jdbcPingEnabled;protected String jdbcPingQuery;protected int jdbcPingConnectionNotUsedFor;protected int jdbcDefaultTransactionIsolationLevel;protected DataSource dataSource;protected SchemaManager commonSchemaManager;protected SchemaManager schemaManager;protected Command<Void> schemaManagementCmd;protected String databaseSchemaUpdate = DB_SCHEMA_UPDATE_FALSE;/*** 执行数据库模式创建或更新操作时是否使用锁.*/protected boolean useLockForDatabaseSchemaUpdate = false;protected String xmlEncoding = "UTF-8";// 命令执行器 ///protected CommandExecutor commandExecutor;protected Collection<? extends CommandInterceptor> defaultCommandInterceptors;protected CommandConfig defaultCommandConfig;protected CommandConfig schemaCommandConfig;protected CommandContextFactory commandContextFactory;protected CommandInterceptor commandInvoker;protected AgendaOperationRunner agendaOperationRunner = (commandContext, runnable) -> runnable.run();protected List<CommandInterceptor> customPreCommandInterceptors;protected List<CommandInterceptor> customPostCommandInterceptors;protected List<CommandInterceptor> commandInterceptors;protected Map<String, AbstractEngineConfiguration> engineConfigurations = new HashMap<>();protected Map<String, AbstractServiceConfiguration> serviceConfigurations = new HashMap<>();protected ClassLoader classLoader;/*** 使用Clas.forname方法或者ClassLoader.loadClass方法加载类。查看http://forums.activiti.org/content/reflectutilloadclass-and-custom- classloader*/protected boolean useClassForNameClassLoading = true;protected List<EngineLifecycleListener> engineLifecycleListeners;// 事件注册 //protected Map<String, EventRegistryEventConsumer> eventRegistryEventConsumers = new HashMap<>();// MYBATIS SQL SESSION 工厂 /protected boolean isDbHistoryUsed = true;protected DbSqlSessionFactory dbSqlSessionFactory;protected SqlSessionFactory sqlSessionFactory;protected TransactionFactory transactionFactory;protected TransactionContextFactory transactionContextFactory;/*** 如果设置为true,则启用批量插入(将sql插入分组在一起)。默认为true.* 对于某些数据库(例如DB2+z/OS),需要将其设置为false.*/protected boolean isBulkInsertEnabled = true;/*** 一些数据库对一条sql insert的参数有限制(例如sql Server,最多2000个参数(不等于插入语句))。如果异常很多时,请调整此参数* 放入到一个大容量插入中,或者如果数据库能够处理,并且有大量数据需要插入,则将其提高.* 默认情况下:100(mssql server为55,因为它在语句中有2000个参数的硬限制)*/protected int maxNrOfStatementsInBulkInsert = 100;public int DEFAULT_MAX_NR_OF_STATEMENTS_BULK_INSERT_SQL_SERVER = 55; // 目前执行的参数最多(35). 2000 / 35 = 57.protected String mybatisMappingFile;protected Set<Class<?>> customMybatisMappers;protected Set<String> customMybatisXMLMappers;protected List<Interceptor> customMybatisInterceptors;protected Set<String> dependentEngineMyBatisXmlMappers;protected List<MybatisTypeAliasConfigurator> dependentEngineMybatisTypeAliasConfigs;protected List<MybatisTypeHandlerConfigurator> dependentEngineMybatisTypeHandlerConfigs;// SESSION 工厂 ///protected List<SessionFactory> customSessionFactories;protected Map<Class<?>, SessionFactory> sessionFactories;protected boolean enableEventDispatcher = true;protected FlowableEventDispatcher eventDispatcher;protected List<FlowableEventListener> eventListeners;protected Map<String, List<FlowableEventListener>> typedEventListeners;protected List<EventDispatchAction> additionalEventDispatchActions;protected LoggingListener loggingListener;protected boolean transactionsExternallyManaged;/*** 使用可设置为配置或不配置关系数据库的标志。这对于完全不使用关系数据库的自定义实现非常有用.** 如果为true(默认值),将使用{@link AbstractEngineConfiguration#getDatabaseSchemaUpdate()}值来确定数据库模式需要执行的操作.** 如果为false,则不会进行验证或模式创建。这意味着之前必须“手动”创建数据库模式,但引擎不会验证该模式是否正确。将不使用{@link AbstractEngineConfiguration#getDatabaseSchemaUpdate()}值.*/protected boolean usingRelationalDatabase = true;/*** 可设置为配置是否使用模式的标志。这对于完全不使用关系数据库的自定义实现非常有用.* 将{@link#usingRelationalDatabase}设置为true将自动意味着使用模式.*/protected boolean usingSchemaMgmt = true;/***允许配置用于process engine所有运行时操作的数据库表前缀。例如,如果指定一个名为“PRE1”的前缀,Flowable将通过'PRE1.ACT_RU_EXECUTION_'表查询执行情况.** 注意:自动数据库模式管理不考虑前缀。如果使用{@link AbstractEngineConfiguration#DB_SCHEMA_UPDATE_CREATE_DROP}或{@link AbstractEngineConfiguration#DB_SCHEMA_UPDATE_TRUE},Flowable将使用默认名称创建数据库表,而不考虑此处配置的前缀.*/protected String databaseTablePrefix = "";/*** 用于进行通配符搜索的转义字符.** 这将添加到包含LIKE子句查询的末尾。例如:SELECT * FROM table WHERE column LIKE '%\%%' 的转义符'\';*/protected String databaseWildcardEscapeCharacter;/*** 要使用的数据库目录*/protected String databaseCatalog = "";/*** 在某些情况下,如果数据库元数据没有正确返回,您需要设置用于表检查/生成的模式, 查看 https://jira.codehaus.org/browse/ACT-1220,* https://jira.codehaus.org/browse/ACT-1062*/protected String databaseSchema;/*** 如果定义的databaseTablePrefix是模式名,而不是实际的表名前缀,则设置为true。这与检查是否存在Flowable表(databaseTablePrefix)有关。如果已经考虑了模式,就不会再使用-,为表检查添加前缀将导致错误的表名.*/protected boolean tablePrefixIsSchema;/*** 如果最新版本的定义可被恢复,则设置为true,忽略可能的父级部署ID值*/protected boolean alwaysLookupLatestDefinitionVersion;/*** 默认查找应退回到默认租户,则设置为true(默认情况下为空字符串或定义的租户值)*/protected boolean fallbackToDefaultTenant;/*** 默认租户提供程序,在全局或本地回退到默认租户值为true的情况下,在查找定义时执行*/protected DefaultTenantProvider defaultTenantProvider = (tenantId, scope, scopeKey) -> NO_TENANT_ID;/*** 启用记录sql语句执行时间的MyBatis插件.*/protected boolean enableLogSqlExecutionTime;protected Properties databaseTypeMappings = getDefaultDatabaseTypeMappings();/*** 获取锁时检查之间的持续时间.*/protected Duration lockPollRate = Duration.ofSeconds(10);/*** 在放弃之前等待DB模式锁定的持续时间.*/protected Duration schemaLockWaitTime = Duration.ofMinutes(5);// 数据管理器 //protected PropertyDataManager propertyDataManager;protected ByteArrayDataManager byteArrayDataManager;protected TableDataManager tableDataManager;// 实体管理器 protected PropertyEntityManager propertyEntityManager;protected ByteArrayEntityManager byteArrayEntityManager;protected List<EngineDeployer> customPreDeployers;protected List<EngineDeployer> customPostDeployers;protected List<EngineDeployer> deployers;// 配置程序 protected boolean enableConfiguratorServiceLoader = true; // 默认情况下启用。在某些环境中,这应该设置为false(例如osgi)protected List<EngineConfigurator> configurators; // 注入式配置器protected List<EngineConfigurator> allConfigurators; // 包括自动发现的配置程序protected EngineConfigurator idmEngineConfigurator;protected EngineConfigurator eventRegistryConfigurator;public static final String PRODUCT_NAME_POSTGRES = "PostgreSQL";public static final String PRODUCT_NAME_CRDB = "CockroachDB";public static final String DATABASE_TYPE_H2 = "h2";public static final String DATABASE_TYPE_HSQL = "hsql";public static final String DATABASE_TYPE_MYSQL = "mysql";public static final String DATABASE_TYPE_ORACLE = "oracle";public static final String DATABASE_TYPE_POSTGRES = "postgres";public static final String DATABASE_TYPE_MSSQL = "mssql";public static final String DATABASE_TYPE_DB2 = "db2";public static final String DATABASE_TYPE_COCKROACHDB = "cockroachdb";public static Properties getDefaultDatabaseTypeMappings() {Properties databaseTypeMappings = new Properties();databaseTypeMappings.setProperty("H2", DATABASE_TYPE_H2);databaseTypeMappings.setProperty("HSQL Database Engine", DATABASE_TYPE_HSQL);databaseTypeMappings.setProperty("MySQL", DATABASE_TYPE_MYSQL);databaseTypeMappings.setProperty("MariaDB", DATABASE_TYPE_MYSQL);databaseTypeMappings.setProperty("Oracle", DATABASE_TYPE_ORACLE);databaseTypeMappings.setProperty(PRODUCT_NAME_POSTGRES, DATABASE_TYPE_POSTGRES);databaseTypeMappings.setProperty("Microsoft SQL Server", DATABASE_TYPE_MSSQL);databaseTypeMappings.setProperty(DATABASE_TYPE_DB2, DATABASE_TYPE_DB2);databaseTypeMappings.setProperty("DB2", DATABASE_TYPE_DB2);databaseTypeMappings.setProperty("DB2/NT", DATABASE_TYPE_DB2);databaseTypeMappings.setProperty("DB2/NT64", DATABASE_TYPE_DB2);databaseTypeMappings.setProperty("DB2 UDP", DATABASE_TYPE_DB2);databaseTypeMappings.setProperty("DB2/LINUX", DATABASE_TYPE_DB2);databaseTypeMappings.setProperty("DB2/LINUX390", DATABASE_TYPE_DB2);databaseTypeMappings.setProperty("DB2/LINUXX8664", DATABASE_TYPE_DB2);databaseTypeMappings.setProperty("DB2/LINUXZ64", DATABASE_TYPE_DB2);databaseTypeMappings.setProperty("DB2/LINUXPPC64", DATABASE_TYPE_DB2);databaseTypeMappings.setProperty("DB2/LINUXPPC64LE", DATABASE_TYPE_DB2);databaseTypeMappings.setProperty("DB2/400 SQL", DATABASE_TYPE_DB2);databaseTypeMappings.setProperty("DB2/6000", DATABASE_TYPE_DB2);databaseTypeMappings.setProperty("DB2 UDB iSeries", DATABASE_TYPE_DB2);databaseTypeMappings.setProperty("DB2/AIX64", DATABASE_TYPE_DB2);databaseTypeMappings.setProperty("DB2/HPUX", DATABASE_TYPE_DB2);databaseTypeMappings.setProperty("DB2/HP64", DATABASE_TYPE_DB2);databaseTypeMappings.setProperty("DB2/SUN", DATABASE_TYPE_DB2);databaseTypeMappings.setProperty("DB2/SUN64", DATABASE_TYPE_DB2);databaseTypeMappings.setProperty("DB2/PTX", DATABASE_TYPE_DB2);databaseTypeMappings.setProperty("DB2/2", DATABASE_TYPE_DB2);databaseTypeMappings.setProperty("DB2 UDB AS400", DATABASE_TYPE_DB2);databaseTypeMappings.setProperty(PRODUCT_NAME_CRDB, DATABASE_TYPE_COCKROACHDB);return databaseTypeMappings;}protected Map<Object, Object> beans;protected IdGenerator idGenerator;protected boolean usePrefixId;protected Clock clock;protected ObjectMapper objectMapper;// 变量public static final int DEFAULT_GENERIC_MAX_LENGTH_STRING = 4000;public static final int DEFAULT_ORACLE_MAX_LENGTH_STRING = 2000;/*** 定义在数据库中存储字符串变量类型的最大长度。主要用于Oracle NVARCHAR2 2000个字符的限制*/protected int maxLengthStringVariableType = -1;protected void initEngineConfigurations() {addEngineConfiguration(getEngineCfgKey(), getEngineScopeType(), this);}// 数据源// ///protected void initDataSource() {if (dataSource == null) {if (dataSourceJndiName != null) {try {dataSource = (DataSource) new InitialContext().lookup(dataSourceJndiName);} catch (Exception e) {throw new FlowableException("couldn't lookup datasource from " + dataSourceJndiName + ": " + e.getMessage(), e);}} else if (jdbcUrl != null) {if ((jdbcDriver == null) || (jdbcUsername == null)) {throw new FlowableException("DataSource or JDBC properties have to be specified in a process engine configuration");}logger.debug("initializing datasource to db: {}", jdbcUrl);if (logger.isInfoEnabled()) {logger.info("Configuring Datasource with following properties (omitted password for security)");logger.info("datasource driver : {}", jdbcDriver);logger.info("datasource url : {}", jdbcUrl);logger.info("datasource user name : {}", jdbcUsername);}PooledDataSource pooledDataSource = new PooledDataSource(this.getClass().getClassLoader(), jdbcDriver, jdbcUrl, jdbcUsername, jdbcPassword);if (jdbcMaxActiveConnections > 0) {pooledDataSource.setPoolMaximumActiveConnections(jdbcMaxActiveConnections);}if (jdbcMaxIdleConnections > 0) {pooledDataSource.setPoolMaximumIdleConnections(jdbcMaxIdleConnections);}if (jdbcMaxCheckoutTime > 0) {pooledDataSource.setPoolMaximumCheckoutTime(jdbcMaxCheckoutTime);}if (jdbcMaxWaitTime > 0) {pooledDataSource.setPoolTimeToWait(jdbcMaxWaitTime);}if (jdbcPingEnabled) {pooledDataSource.setPoolPingEnabled(true);if (jdbcPingQuery != null) {pooledDataSource.setPoolPingQuery(jdbcPingQuery);}pooledDataSource.setPoolPingConnectionsNotUsedFor(jdbcPingConnectionNotUsedFor);}if (jdbcDefaultTransactionIsolationLevel > 0) {pooledDataSource.setDefaultTransactionIsolationLevel(jdbcDefaultTransactionIsolationLevel);}dataSource = pooledDataSource;}}if (databaseType == null) {initDatabaseType();}}public void initDatabaseType() {Connection connection = null;try {connection = dataSource.getConnection();DatabaseMetaData databaseMetaData = connection.getMetaData();String databaseProductName = databaseMetaData.getDatabaseProductName();logger.debug("database product name: '{}'", databaseProductName);// CRDB不会通过jdbc驱动程序公开这个版本,所以我们需要通过version()获取它.if (PRODUCT_NAME_POSTGRES.equalsIgnoreCase(databaseProductName)) {try (PreparedStatement preparedStatement = connection.prepareStatement("select version() as version;");ResultSet resultSet = preparedStatement.executeQuery()) {String version = null;if (resultSet.next()) {version = resultSet.getString("version");}if (StringUtils.isNotEmpty(version) && version.toLowerCase().startsWith(PRODUCT_NAME_CRDB.toLowerCase())) {databaseProductName = PRODUCT_NAME_CRDB;logger.info("CockroachDB version '{}' detected", version);}}}databaseType = databaseTypeMappings.getProperty(databaseProductName);if (databaseType == null) {throw new FlowableException("couldn't deduct database type from database product name '" + databaseProductName + "'");}logger.debug("using database type: {}", databaseType);} catch (SQLException e) {throw new RuntimeException("Exception while initializing Database connection", e);} finally {try {if (connection != null) {connection.close();}} catch (SQLException e) {logger.error("Exception while closing the Database connection", e);}}// 特别注意MSSQL,因为每个语句(包括批量语句)有2000个参数的硬限制.// 特别是在执行时,默认值为100,这一限制就超过了.if (DATABASE_TYPE_MSSQL.equals(databaseType)) {maxNrOfStatementsInBulkInsert = DEFAULT_MAX_NR_OF_STATEMENTS_BULK_INSERT_SQL_SERVER;}}public void initSchemaManager() {if (this.commonSchemaManager == null) {this.commonSchemaManager = new CommonDbSchemaManager();}}// session 工厂 public void addSessionFactory(SessionFactory sessionFactory) {sessionFactories.put(sessionFactory.getSessionType(), sessionFactory);}public void initCommandContextFactory() {if (commandContextFactory == null) {commandContextFactory = new CommandContextFactory();}}public void initTransactionContextFactory() {if (transactionContextFactory == null) {transactionContextFactory = new StandaloneMybatisTransactionContextFactory();}}public void initCommandExecutors() {initDefaultCommandConfig();initSchemaCommandConfig();initCommandInvoker();initCommandInterceptors();initCommandExecutor();}public void initDefaultCommandConfig() {if (defaultCommandConfig == null) {defaultCommandConfig = new CommandConfig();}}public void initSchemaCommandConfig() {if (schemaCommandConfig == null) {schemaCommandConfig = new CommandConfig();}}public void initCommandInvoker() {if (commandInvoker == null) {commandInvoker = new DefaultCommandInvoker();}}public void initCommandInterceptors() {if (commandInterceptors == null) {commandInterceptors = new ArrayList<>();if (customPreCommandInterceptors != null) {commandInterceptors.addAll(customPreCommandInterceptors);}commandInterceptors.addAll(getDefaultCommandInterceptors());if (customPostCommandInterceptors != null) {commandInterceptors.addAll(customPostCommandInterceptors);}commandInterceptors.add(commandInvoker);}}public Collection<? extends CommandInterceptor> getDefaultCommandInterceptors() {if (defaultCommandInterceptors == null) {List<CommandInterceptor> interceptors = new ArrayList<>();interceptors.add(new LogInterceptor());if (DATABASE_TYPE_COCKROACHDB.equals(databaseType)) {interceptors.add(new CrDbRetryInterceptor());}CommandInterceptor transactionInterceptor = createTransactionInterceptor();if (transactionInterceptor != null) {interceptors.add(transactionInterceptor);}if (commandContextFactory != null) {String engineCfgKey = getEngineCfgKey();CommandContextInterceptor commandContextInterceptor = new CommandContextInterceptor(commandContextFactory, classLoader, useClassForNameClassLoading, clock, objectMapper);engineConfigurations.put(engineCfgKey, this);commandContextInterceptor.setEngineCfgKey(engineCfgKey);commandContextInterceptor.setEngineConfigurations(engineConfigurations);interceptors.add(commandContextInterceptor);}if (transactionContextFactory != null) {interceptors.add(new TransactionContextInterceptor(transactionContextFactory));}List<CommandInterceptor> additionalCommandInterceptors = getAdditionalDefaultCommandInterceptors();if (additionalCommandInterceptors != null) {interceptors.addAll(additionalCommandInterceptors);}defaultCommandInterceptors = interceptors;}return defaultCommandInterceptors;}public abstract String getEngineCfgKey();public abstract String getEngineScopeType();public List<CommandInterceptor> getAdditionalDefaultCommandInterceptors() {return null;}public void initCommandExecutor() {if (commandExecutor == null) {CommandInterceptor first = initInterceptorChain(commandInterceptors);commandExecutor = new CommandExecutorImpl(getDefaultCommandConfig(), first);}}public CommandInterceptor initInterceptorChain(List<CommandInterceptor> chain) {if (chain == null || chain.isEmpty()) {throw new FlowableException("invalid command interceptor chain configuration: " + chain);}for (int i = 0; i < chain.size() - 1; i++) {chain.get(i).setNext(chain.get(i + 1));}return chain.get(0);}public abstract CommandInterceptor createTransactionInterceptor();public void initBeans() {if (beans == null) {beans = new HashMap<>();}}// ID生成器// /public void initIdGenerator() {if (idGenerator == null) {idGenerator = new StrongUuidGenerator();}}public void initObjectMapper() {if (objectMapper == null) {objectMapper = new ObjectMapper();objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);}}public void initClock() {if (clock == null) {clock = new DefaultClockImpl();}}// 数据管理器 ///public void initDataManagers() {if (propertyDataManager == null) {propertyDataManager = new MybatisPropertyDataManager(idGenerator);}if (byteArrayDataManager == null) {byteArrayDataManager = new MybatisByteArrayDataManager(idGenerator);}}// 实体管理器 //public void initEntityManagers() {if (propertyEntityManager == null) {propertyEntityManager = new PropertyEntityManagerImpl(this, propertyDataManager);}if (byteArrayEntityManager == null) {byteArrayEntityManager = new ByteArrayEntityManagerImpl(byteArrayDataManager, getEngineCfgKey(), this::getEventDispatcher);}if (tableDataManager == null) {tableDataManager = new TableDataManagerImpl(this);}}// services// /protected void initService(Object service) {if (service instanceof CommonEngineServiceImpl) {((CommonEngineServiceImpl) service).setCommandExecutor(commandExecutor);}}// myBatis SqlSessionFactory// public void initSessionFactories() {if (sessionFactories == null) {sessionFactories = new HashMap<>();if (usingRelationalDatabase) {initDbSqlSessionFactory();}addSessionFactory(new GenericManagerFactory(EntityCache.class, EntityCacheImpl.class));if (isLoggingSessionEnabled()) {if (!sessionFactories.containsKey(LoggingSession.class)) {LoggingSessionFactory loggingSessionFactory = new LoggingSessionFactory();loggingSessionFactory.setLoggingListener(loggingListener);loggingSessionFactory.setObjectMapper(objectMapper);sessionFactories.put(LoggingSession.class, loggingSessionFactory);}}commandContextFactory.setSessionFactories(sessionFactories);} else {if (usingRelationalDatabase) {initDbSqlSessionFactoryEntitySettings();}}if (customSessionFactories != null) {for (SessionFactory sessionFactory : customSessionFactories) {addSessionFactory(sessionFactory);}}}public void initDbSqlSessionFactory() {if (dbSqlSessionFactory == null) {dbSqlSessionFactory = createDbSqlSessionFactory();}dbSqlSessionFactory.setDatabaseType(databaseType);dbSqlSessionFactory.setSqlSessionFactory(sqlSessionFactory);dbSqlSessionFactory.setDbHistoryUsed(isDbHistoryUsed);dbSqlSessionFactory.setDatabaseTablePrefix(databaseTablePrefix);dbSqlSessionFactory.setTablePrefixIsSchema(tablePrefixIsSchema);dbSqlSessionFactory.setDatabaseCatalog(databaseCatalog);dbSqlSessionFactory.setDatabaseSchema(databaseSchema);dbSqlSessionFactory.setMaxNrOfStatementsInBulkInsert(maxNrOfStatementsInBulkInsert);initDbSqlSessionFactoryEntitySettings();addSessionFactory(dbSqlSessionFactory);}public DbSqlSessionFactory createDbSqlSessionFactory() {return new DbSqlSessionFactory(usePrefixId);}protected abstract void initDbSqlSessionFactoryEntitySettings();protected void defaultInitDbSqlSessionFactoryEntitySettings(List<Class<? extends Entity>> insertOrder, List<Class<? extends Entity>> deleteOrder) {if (insertOrder != null) {for (Class<? extends Entity> clazz : insertOrder) {dbSqlSessionFactory.getInsertionOrder().add(clazz);if (isBulkInsertEnabled) {dbSqlSessionFactory.getBulkInserteableEntityClasses().add(clazz);}}}if (deleteOrder != null) {for (Class<? extends Entity> clazz : deleteOrder) {dbSqlSessionFactory.getDeletionOrder().add(clazz);}}}public void initTransactionFactory() {if (transactionFactory == null) {if (transactionsExternallyManaged) {transactionFactory = new ManagedTransactionFactory();Properties properties = new Properties();properties.put("closeConnection", "false");this.transactionFactory.setProperties(properties);} else {transactionFactory = new JdbcTransactionFactory();}}}public void initSqlSessionFactory() {if (sqlSessionFactory == null) {InputStream inputStream = null;try {inputStream = getMyBatisXmlConfigurationStream();Environment environment = new Environment("default", transactionFactory, dataSource);Reader reader = new InputStreamReader(inputStream);Properties properties = new Properties();properties.put("prefix", databaseTablePrefix);String wildcardEscapeClause = "";if ((databaseWildcardEscapeCharacter != null) && (databaseWildcardEscapeCharacter.length() != 0)) {wildcardEscapeClause = " escape '" + databaseWildcardEscapeCharacter + "'";}properties.put("wildcardEscapeClause", wildcardEscapeClause);// set default propertiesproperties.put("limitBefore", "");properties.put("limitAfter", "");properties.put("limitBetween", "");properties.put("limitBeforeNativeQuery", "");properties.put("limitAfterNativeQuery", "");properties.put("blobType", "BLOB");properties.put("boolValue", "TRUE");if (databaseType != null) {properties.load(getResourceAsStream(pathToEngineDbProperties()));}Configuration configuration = initMybatisConfiguration(environment, reader, properties);sqlSessionFactory = new DefaultSqlSessionFactory(configuration);} catch (Exception e) {throw new FlowableException("Error while building ibatis SqlSessionFactory: " + e.getMessage(), e);} finally {IoUtil.closeSilently(inputStream);}}}public String pathToEngineDbProperties() {return "org/flowable/common/db/properties/" + databaseType + ".properties";}public Configuration initMybatisConfiguration(Environment environment, Reader reader, Properties properties) {XMLConfigBuilder parser = new XMLConfigBuilder(reader, "", properties);Configuration configuration = parser.getConfiguration();if (databaseType != null) {configuration.setDatabaseId(databaseType);}configuration.setEnvironment(environment);initCustomMybatisMappers(configuration);initMybatisTypeHandlers(configuration);initCustomMybatisInterceptors(configuration);if (isEnableLogSqlExecutionTime()) {initMyBatisLogSqlExecutionTimePlugin(configuration);}configuration = parseMybatisConfiguration(parser);return configuration;}public void initCustomMybatisMappers(Configuration configuration) {if (getCustomMybatisMappers() != null) {for (Class<?> clazz : getCustomMybatisMappers()) {configuration.addMapper(clazz);}}}public void initMybatisTypeHandlers(Configuration configuration) {// MyBatis当前存在问题映射到Map<String,Object>.// 它将返回特定于驱动程序的对象.// 因此,我们正在Object.class和特殊jdbc类型间映射.// 更多信息 https://github.com/mybatis/mybatis-3/issues/2216 TypeHandlerRegistry handlerRegistry = configuration.getTypeHandlerRegistry();handlerRegistry.register(Object.class, JdbcType.BOOLEAN, new BooleanTypeHandler());handlerRegistry.register(Object.class, JdbcType.BIT, new BooleanTypeHandler());handlerRegistry.register(Object.class, JdbcType.TINYINT, new ByteTypeHandler());handlerRegistry.register(Object.class, JdbcType.SMALLINT, new ShortTypeHandler());handlerRegistry.register(Object.class, JdbcType.INTEGER, new IntegerTypeHandler());handlerRegistry.register(Object.class, JdbcType.FLOAT, new FloatTypeHandler());handlerRegistry.register(Object.class, JdbcType.DOUBLE, new DoubleTypeHandler());handlerRegistry.register(Object.class, JdbcType.CHAR, new StringTypeHandler());handlerRegistry.register(Object.class, JdbcType.CLOB, new ClobTypeHandler());handlerRegistry.register(Object.class, JdbcType.VARCHAR, new StringTypeHandler());handlerRegistry.register(Object.class, JdbcType.LONGVARCHAR, new StringTypeHandler());handlerRegistry.register(Object.class, JdbcType.NVARCHAR, new NStringTypeHandler());handlerRegistry.register(Object.class, JdbcType.NCHAR, new NStringTypeHandler());handlerRegistry.register(Object.class, JdbcType.NCLOB, new NClobTypeHandler());handlerRegistry.register(Object.class, JdbcType.ARRAY, new ArrayTypeHandler());handlerRegistry.register(Object.class, JdbcType.BIGINT, new LongTypeHandler());handlerRegistry.register(Object.class, JdbcType.REAL, new BigDecimalTypeHandler());handlerRegistry.register(Object.class, JdbcType.DECIMAL, new BigDecimalTypeHandler());handlerRegistry.register(Object.class, JdbcType.NUMERIC, new BigDecimalTypeHandler());handlerRegistry.register(Object.class, JdbcType.BLOB, new BlobInputStreamTypeHandler());handlerRegistry.register(Object.class, JdbcType.LONGVARCHAR, new BlobByteObjectArrayTypeHandler());handlerRegistry.register(Object.class, JdbcType.DATE, new DateOnlyTypeHandler());handlerRegistry.register(Object.class, JdbcType.TIME, new TimeOnlyTypeHandler());handlerRegistry.register(Object.class, JdbcType.TIMESTAMP, new DateTypeHandler());handlerRegistry.register(Object.class, JdbcType.SQLXML, new SqlxmlTypeHandler());}public void initCustomMybatisInterceptors(Configuration configuration) {if (customMybatisInterceptors!=null){for (Interceptor interceptor :customMybatisInterceptors){configuration.addInterceptor(interceptor);}}}public void initMyBatisLogSqlExecutionTimePlugin(Configuration configuration) {configuration.addInterceptor(new LogSqlExecutionTimePlugin());}public Configuration parseMybatisConfiguration(XMLConfigBuilder parser) {Configuration configuration = parser.parse();if (dependentEngineMybatisTypeAliasConfigs != null) {for (MybatisTypeAliasConfigurator typeAliasConfig : dependentEngineMybatisTypeAliasConfigs) {typeAliasConfig.configure(configuration.getTypeAliasRegistry());}}if (dependentEngineMybatisTypeHandlerConfigs != null) {for (MybatisTypeHandlerConfigurator typeHandlerConfig : dependentEngineMybatisTypeHandlerConfigs) {typeHandlerConfig.configure(configuration.getTypeHandlerRegistry());}}parseDependentEngineMybatisXMLMappers(configuration);parseCustomMybatisXMLMappers(configuration);return configuration;}public void parseCustomMybatisXMLMappers(Configuration configuration) {if (getCustomMybatisXMLMappers() != null) {for (String resource : getCustomMybatisXMLMappers()) {parseMybatisXmlMapping(configuration, resource);}}}public void parseDependentEngineMybatisXMLMappers(Configuration configuration) {if (getDependentEngineMyBatisXmlMappers() != null) {for (String resource : getDependentEngineMyBatisXmlMappers()) {parseMybatisXmlMapping(configuration, resource);}}}protected void parseMybatisXmlMapping(Configuration configuration, String resource) {// 查看 XMLConfigBuilder.mapperElement()XMLMapperBuilder mapperParser = new XMLMapperBuilder(getResourceAsStream(resource), configuration, resource, configuration.getSqlFragments());mapperParser.parse();}protected InputStream getResourceAsStream(String resource) {ClassLoader classLoader = getClassLoader();if (classLoader != null) {return getClassLoader().getResourceAsStream(resource);} else {return this.getClass().getClassLoader().getResourceAsStream(resource);}}public void setMybatisMappingFile(String file) {this.mybatisMappingFile = file;}public String getMybatisMappingFile() {return mybatisMappingFile;}public abstract InputStream getMyBatisXmlConfigurationStream();public void initConfigurators() {allConfigurators = new ArrayList<>();allConfigurators.addAll(getEngineSpecificEngineConfigurators());// 显式添加到配置中的配置程序if (configurators != null) {allConfigurators.addAll(configurators);}// 通过ServiceLoader自动发现if (enableConfiguratorServiceLoader) {ClassLoader classLoader = getClassLoader();if (classLoader == null) {classLoader = ReflectUtil.getClassLoader();}ServiceLoader<EngineConfigurator> configuratorServiceLoader = ServiceLoader.load(EngineConfigurator.class, classLoader);int nrOfServiceLoadedConfigurators = 0;for (EngineConfigurator configurator : configuratorServiceLoader) {allConfigurators.add(configurator);nrOfServiceLoadedConfigurators++;}if (nrOfServiceLoadedConfigurators > 0) {logger.info("Found {} auto-discoverable Process Engine Configurator{}", nrOfServiceLoadedConfigurators, nrOfServiceLoadedConfigurators > 1 ? "s" : "");}if (!allConfigurators.isEmpty()) {// 根据优先顺序排列(对依赖型配置器有用)allConfigurators.sort(new Comparator<EngineConfigurator>() {@Overridepublic int compare(EngineConfigurator configurator1, EngineConfigurator configurator2) {int priority1 = configurator1.getPriority();int priority2 = configurator2.getPriority();if (priority1 < priority2) {return -1;} else if (priority1 > priority2) {return 1;}return 0;}});// 执行配置程序logger.info("Found {} Engine Configurators in total:", allConfigurators.size());for (EngineConfigurator configurator : allConfigurators) {logger.info("{} (priority:{})", configurator.getClass(), configurator.getPriority());}}}}public void close() {if (forceCloseMybatisConnectionPool && dataSource instanceof PooledDataSource) {/** 当数据源由Flowable引擎创建 (i.e. 它是PooledDataSource的实例),* 关闭引擎时,需要关闭连接池.* 请注意,多次调用forceCloseAll()是可以的(与使用多个引擎运行时的情况相同).*/((PooledDataSource) dataSource).forceCloseAll();}}protected List<EngineConfigurator> getEngineSpecificEngineConfigurators() {// 如果需要的话可以被覆盖return Collections.emptyList();}public void configuratorsBeforeInit() {for (EngineConfigurator configurator : allConfigurators) {logger.info("Executing beforeInit() of {} (priority:{})", configurator.getClass(), configurator.getPriority());configurator.beforeInit(this);}}public void configuratorsAfterInit() {for (EngineConfigurator configurator : allConfigurators) {logger.info("Executing configure() of {} (priority:{})", configurator.getClass(), configurator.getPriority());configurator.configure(this);}}public LockManager getLockManager(String lockName) {return new LockManagerImpl(commandExecutor, lockName, getLockPollRate(), getEngineCfgKey());}// getters and setters方法// //public abstract String getEngineName();public ClassLoader getClassLoader() {return classLoader;}public AbstractEngineConfiguration setClassLoader(ClassLoader classLoader) {this.classLoader = classLoader;return this;}public boolean isUseClassForNameClassLoading() {return useClassForNameClassLoading;}public AbstractEngineConfiguration setUseClassForNameClassLoading(boolean useClassForNameClassLoading) {this.useClassForNameClassLoading = useClassForNameClassLoading;return this;}public void addEngineLifecycleListener(EngineLifecycleListener engineLifecycleListener) {if (this.engineLifecycleListeners == null) {this.engineLifecycleListeners = new ArrayList<>();}this.engineLifecycleListeners.add(engineLifecycleListener);}public List<EngineLifecycleListener> getEngineLifecycleListeners() {return engineLifecycleListeners;}public AbstractEngineConfiguration setEngineLifecycleListeners(List<EngineLifecycleListener> engineLifecycleListeners) {this.engineLifecycleListeners = engineLifecycleListeners;return this;}public String getDatabaseType() {return databaseType;}public AbstractEngineConfiguration setDatabaseType(String databaseType) {this.databaseType = databaseType;return this;}public DataSource getDataSource() {return dataSource;}public AbstractEngineConfiguration setDataSource(DataSource dataSource) {this.dataSource = dataSource;return this;}public SchemaManager getSchemaManager() {return schemaManager;}public AbstractEngineConfiguration setSchemaManager(SchemaManager schemaManager) {this.schemaManager = schemaManager;return this;}public SchemaManager getCommonSchemaManager() {return commonSchemaManager;}public AbstractEngineConfiguration setCommonSchemaManager(SchemaManager commonSchemaManager) {this.commonSchemaManager = commonSchemaManager;return this;}public Command<Void> getSchemaManagementCmd() {return schemaManagementCmd;}public AbstractEngineConfiguration setSchemaManagementCmd(Command<Void> schemaManagementCmd) {this.schemaManagementCmd = schemaManagementCmd;return this;}public String getJdbcDriver() {return jdbcDriver;}public AbstractEngineConfiguration setJdbcDriver(String jdbcDriver) {this.jdbcDriver = jdbcDriver;return this;}public String getJdbcUrl() {return jdbcUrl;}public AbstractEngineConfiguration setJdbcUrl(String jdbcUrl) {this.jdbcUrl = jdbcUrl;return this;}public String getJdbcUsername() {return jdbcUsername;}public AbstractEngineConfiguration setJdbcUsername(String jdbcUsername) {this.jdbcUsername = jdbcUsername;return this;}public String getJdbcPassword() {return jdbcPassword;}public AbstractEngineConfiguration setJdbcPassword(String jdbcPassword) {this.jdbcPassword = jdbcPassword;return this;}public int getJdbcMaxActiveConnections() {return jdbcMaxActiveConnections;}public AbstractEngineConfiguration setJdbcMaxActiveConnections(int jdbcMaxActiveConnections) {this.jdbcMaxActiveConnections = jdbcMaxActiveConnections;return this;}public int getJdbcMaxIdleConnections() {return jdbcMaxIdleConnections;}public AbstractEngineConfiguration setJdbcMaxIdleConnections(int jdbcMaxIdleConnections) {this.jdbcMaxIdleConnections = jdbcMaxIdleConnections;return this;}public int getJdbcMaxCheckoutTime() {return jdbcMaxCheckoutTime;}public AbstractEngineConfiguration setJdbcMaxCheckoutTime(int jdbcMaxCheckoutTime) {this.jdbcMaxCheckoutTime = jdbcMaxCheckoutTime;return this;}public int getJdbcMaxWaitTime() {return jdbcMaxWaitTime;}public AbstractEngineConfiguration setJdbcMaxWaitTime(int jdbcMaxWaitTime) {this.jdbcMaxWaitTime = jdbcMaxWaitTime;return this;}public boolean isJdbcPingEnabled() {return jdbcPingEnabled;}public AbstractEngineConfiguration setJdbcPingEnabled(boolean jdbcPingEnabled) {this.jdbcPingEnabled = jdbcPingEnabled;return this;}public int getJdbcPingConnectionNotUsedFor() {return jdbcPingConnectionNotUsedFor;}public AbstractEngineConfiguration setJdbcPingConnectionNotUsedFor(int jdbcPingConnectionNotUsedFor) {this.jdbcPingConnectionNotUsedFor = jdbcPingConnectionNotUsedFor;return this;}public int getJdbcDefaultTransactionIsolationLevel() {return jdbcDefaultTransactionIsolationLevel;}public AbstractEngineConfiguration setJdbcDefaultTransactionIsolationLevel(int jdbcDefaultTransactionIsolationLevel) {this.jdbcDefaultTransactionIsolationLevel = jdbcDefaultTransactionIsolationLevel;return this;}public String getJdbcPingQuery() {return jdbcPingQuery;}public AbstractEngineConfiguration setJdbcPingQuery(String jdbcPingQuery) {this.jdbcPingQuery = jdbcPingQuery;return this;}public String getDataSourceJndiName() {return dataSourceJndiName;}public AbstractEngineConfiguration setDataSourceJndiName(String dataSourceJndiName) {this.dataSourceJndiName = dataSourceJndiName;return this;}public CommandConfig getSchemaCommandConfig() {return schemaCommandConfig;}public AbstractEngineConfiguration setSchemaCommandConfig(CommandConfig schemaCommandConfig) {this.schemaCommandConfig = schemaCommandConfig;return this;}public boolean isTransactionsExternallyManaged() {return transactionsExternallyManaged;}public AbstractEngineConfiguration setTransactionsExternallyManaged(boolean transactionsExternallyManaged) {this.transactionsExternallyManaged = transactionsExternallyManaged;return this;}public Map<Object, Object> getBeans() {return beans;}public AbstractEngineConfiguration setBeans(Map<Object, Object> beans) {this.beans = beans;return this;}public IdGenerator getIdGenerator() {return idGenerator;}public AbstractEngineConfiguration setIdGenerator(IdGenerator idGenerator) {this.idGenerator = idGenerator;return this;}public boolean isUsePrefixId() {return usePrefixId;}public AbstractEngineConfiguration setUsePrefixId(boolean usePrefixId) {this.usePrefixId = usePrefixId;return this;}public String getXmlEncoding() {return xmlEncoding;}public AbstractEngineConfiguration setXmlEncoding(String xmlEncoding) {this.xmlEncoding = xmlEncoding;return this;}public CommandConfig getDefaultCommandConfig() {return defaultCommandConfig;}public AbstractEngineConfiguration setDefaultCommandConfig(CommandConfig defaultCommandConfig) {this.defaultCommandConfig = defaultCommandConfig;return this;}public CommandExecutor getCommandExecutor() {return commandExecutor;}public AbstractEngineConfiguration setCommandExecutor(CommandExecutor commandExecutor) {this.commandExecutor = commandExecutor;return this;}public CommandContextFactory getCommandContextFactory() {return commandContextFactory;}public AbstractEngineConfiguration setCommandContextFactory(CommandContextFactory commandContextFactory) {this.commandContextFactory = commandContextFactory;return this;}public CommandInterceptor getCommandInvoker() {return commandInvoker;}public AbstractEngineConfiguration setCommandInvoker(CommandInterceptor commandInvoker) {this.commandInvoker = commandInvoker;return this;}public AgendaOperationRunner getAgendaOperationRunner() {return agendaOperationRunner;}public AbstractEngineConfiguration setAgendaOperationRunner(AgendaOperationRunner agendaOperationRunner) {this.agendaOperationRunner = agendaOperationRunner;return this;}public List<CommandInterceptor> getCustomPreCommandInterceptors() {return customPreCommandInterceptors;}public AbstractEngineConfiguration setCustomPreCommandInterceptors(List<CommandInterceptor> customPreCommandInterceptors) {this.customPreCommandInterceptors = customPreCommandInterceptors;return this;}public List<CommandInterceptor> getCustomPostCommandInterceptors() {return customPostCommandInterceptors;}public AbstractEngineConfiguration setCustomPostCommandInterceptors(List<CommandInterceptor> customPostCommandInterceptors) {this.customPostCommandInterceptors = customPostCommandInterceptors;return this;}public List<CommandInterceptor> getCommandInterceptors() {return commandInterceptors;}public AbstractEngineConfiguration setCommandInterceptors(List<CommandInterceptor> commandInterceptors) {this.commandInterceptors = commandInterceptors;return this;}public Map<String, AbstractEngineConfiguration> getEngineConfigurations() {return engineConfigurations;}public AbstractEngineConfiguration setEngineConfigurations(Map<String, AbstractEngineConfiguration> engineConfigurations) {this.engineConfigurations = engineConfigurations;return this;}public void addEngineConfiguration(String key, String scopeType, AbstractEngineConfiguration engineConfiguration) {if (engineConfigurations == null) {engineConfigurations = new HashMap<>();}engineConfigurations.put(key, engineConfiguration);engineConfigurations.put(scopeType, engineConfiguration);}public Map<String, AbstractServiceConfiguration> getServiceConfigurations() {return serviceConfigurations;}public AbstractEngineConfiguration setServiceConfigurations(Map<String, AbstractServiceConfiguration> serviceConfigurations) {this.serviceConfigurations = serviceConfigurations;return this;}public void addServiceConfiguration(String key, AbstractServiceConfiguration serviceConfiguration) {if (serviceConfigurations == null) {serviceConfigurations = new HashMap<>();}serviceConfigurations.put(key, serviceConfiguration);}public Map<String, EventRegistryEventConsumer> getEventRegistryEventConsumers() {return eventRegistryEventConsumers;}public AbstractEngineConfiguration setEventRegistryEventConsumers(Map<String, EventRegistryEventConsumer> eventRegistryEventConsumers) {this.eventRegistryEventConsumers = eventRegistryEventConsumers;return this;}public void addEventRegistryEventConsumer(String key, EventRegistryEventConsumer eventRegistryEventConsumer) {if (eventRegistryEventConsumers == null) {eventRegistryEventConsumers = new HashMap<>();}eventRegistryEventConsumers.put(key, eventRegistryEventConsumer);}public AbstractEngineConfiguration setDefaultCommandInterceptors(Collection<? extends CommandInterceptor> defaultCommandInterceptors) {this.defaultCommandInterceptors = defaultCommandInterceptors;return this;}public SqlSessionFactory getSqlSessionFactory() {return sqlSessionFactory;}public AbstractEngineConfiguration setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {this.sqlSessionFactory = sqlSessionFactory;return this;}public boolean isDbHistoryUsed() {return isDbHistoryUsed;}public AbstractEngineConfiguration setDbHistoryUsed(boolean isDbHistoryUsed) {this.isDbHistoryUsed = isDbHistoryUsed;return this;}public DbSqlSessionFactory getDbSqlSessionFactory() {return dbSqlSessionFactory;}public AbstractEngineConfiguration setDbSqlSessionFactory(DbSqlSessionFactory dbSqlSessionFactory) {this.dbSqlSessionFactory = dbSqlSessionFactory;return this;}public TransactionFactory getTransactionFactory() {return transactionFactory;}public AbstractEngineConfiguration setTransactionFactory(TransactionFactory transactionFactory) {this.transactionFactory = transactionFactory;return this;}public TransactionContextFactory getTransactionContextFactory() {return transactionContextFactory;}public AbstractEngineConfiguration setTransactionContextFactory(TransactionContextFactory transactionContextFactory) {this.transactionContextFactory = transactionContextFactory;return this;}public int getMaxNrOfStatementsInBulkInsert() {return maxNrOfStatementsInBulkInsert;}public AbstractEngineConfiguration setMaxNrOfStatementsInBulkInsert(int maxNrOfStatementsInBulkInsert) {this.maxNrOfStatementsInBulkInsert = maxNrOfStatementsInBulkInsert;return this;}public boolean isBulkInsertEnabled() {return isBulkInsertEnabled;}public AbstractEngineConfiguration setBulkInsertEnabled(boolean isBulkInsertEnabled) {this.isBulkInsertEnabled = isBulkInsertEnabled;return this;}public Set<Class<?>> getCustomMybatisMappers() {return customMybatisMappers;}public AbstractEngineConfiguration setCustomMybatisMappers(Set<Class<?>> customMybatisMappers) {this.customMybatisMappers = customMybatisMappers;return this;}public Set<String> getCustomMybatisXMLMappers() {return customMybatisXMLMappers;}public AbstractEngineConfiguration setCustomMybatisXMLMappers(Set<String> customMybatisXMLMappers) {this.customMybatisXMLMappers = customMybatisXMLMappers;return this;}public Set<String> getDependentEngineMyBatisXmlMappers() {return dependentEngineMyBatisXmlMappers;}public AbstractEngineConfiguration setCustomMybatisInterceptors(List<Interceptor> customMybatisInterceptors) {this.customMybatisInterceptors = customMybatisInterceptors;return  this;}public List<Interceptor> getCustomMybatisInterceptors() {return customMybatisInterceptors;}public AbstractEngineConfiguration setDependentEngineMyBatisXmlMappers(Set<String> dependentEngineMyBatisXmlMappers) {this.dependentEngineMyBatisXmlMappers = dependentEngineMyBatisXmlMappers;return this;}public List<MybatisTypeAliasConfigurator> getDependentEngineMybatisTypeAliasConfigs() {return dependentEngineMybatisTypeAliasConfigs;}public AbstractEngineConfiguration setDependentEngineMybatisTypeAliasConfigs(List<MybatisTypeAliasConfigurator> dependentEngineMybatisTypeAliasConfigs) {this.dependentEngineMybatisTypeAliasConfigs = dependentEngineMybatisTypeAliasConfigs;return this;}public List<MybatisTypeHandlerConfigurator> getDependentEngineMybatisTypeHandlerConfigs() {return dependentEngineMybatisTypeHandlerConfigs;}public AbstractEngineConfiguration setDependentEngineMybatisTypeHandlerConfigs(List<MybatisTypeHandlerConfigurator> dependentEngineMybatisTypeHandlerConfigs) {this.dependentEngineMybatisTypeHandlerConfigs = dependentEngineMybatisTypeHandlerConfigs;return this;}public List<SessionFactory> getCustomSessionFactories() {return customSessionFactories;}public AbstractEngineConfiguration addCustomSessionFactory(SessionFactory sessionFactory) {if (customSessionFactories == null) {customSessionFactories = new ArrayList<>();}customSessionFactories.add(sessionFactory);return this;}public AbstractEngineConfiguration setCustomSessionFactories(List<SessionFactory> customSessionFactories) {this.customSessionFactories = customSessionFactories;return this;}public boolean isUsingRelationalDatabase() {return usingRelationalDatabase;}public AbstractEngineConfiguration setUsingRelationalDatabase(boolean usingRelationalDatabase) {this.usingRelationalDatabase = usingRelationalDatabase;return this;}public boolean isUsingSchemaMgmt() {return usingSchemaMgmt;}public AbstractEngineConfiguration setUsingSchemaMgmt(boolean usingSchema) {this.usingSchemaMgmt = usingSchema;return this;}public String getDatabaseTablePrefix() {return databaseTablePrefix;}public AbstractEngineConfiguration setDatabaseTablePrefix(String databaseTablePrefix) {this.databaseTablePrefix = databaseTablePrefix;return this;}public String getDatabaseWildcardEscapeCharacter() {return databaseWildcardEscapeCharacter;}public AbstractEngineConfiguration setDatabaseWildcardEscapeCharacter(String databaseWildcardEscapeCharacter) {this.databaseWildcardEscapeCharacter = databaseWildcardEscapeCharacter;return this;}public String getDatabaseCatalog() {return databaseCatalog;}public AbstractEngineConfiguration setDatabaseCatalog(String databaseCatalog) {this.databaseCatalog = databaseCatalog;return this;}public String getDatabaseSchema() {return databaseSchema;}public AbstractEngineConfiguration setDatabaseSchema(String databaseSchema) {this.databaseSchema = databaseSchema;return this;}public boolean isTablePrefixIsSchema() {return tablePrefixIsSchema;}public AbstractEngineConfiguration setTablePrefixIsSchema(boolean tablePrefixIsSchema) {this.tablePrefixIsSchema = tablePrefixIsSchema;return this;}public boolean isAlwaysLookupLatestDefinitionVersion() {return alwaysLookupLatestDefinitionVersion;}public AbstractEngineConfiguration setAlwaysLookupLatestDefinitionVersion(boolean alwaysLookupLatestDefinitionVersion) {this.alwaysLookupLatestDefinitionVersion = alwaysLookupLatestDefinitionVersion;return this;}public boolean isFallbackToDefaultTenant() {return fallbackToDefaultTenant;}public AbstractEngineConfiguration setFallbackToDefaultTenant(boolean fallbackToDefaultTenant) {this.fallbackToDefaultTenant = fallbackToDefaultTenant;return this;}/*** @return 默认租户的名称* @废弃方法 使用 {@link AbstractEngineConfiguration#getDefaultTenantProvider()} 替代*/@Deprecatedpublic String getDefaultTenantValue() {return getDefaultTenantProvider().getDefaultTenant(null, null, null);}public AbstractEngineConfiguration setDefaultTenantValue(String defaultTenantValue) {this.defaultTenantProvider = (tenantId, scope, scopeKey) -> defaultTenantValue;return this;}public DefaultTenantProvider getDefaultTenantProvider() {return defaultTenantProvider;}public AbstractEngineConfiguration setDefaultTenantProvider(DefaultTenantProvider defaultTenantProvider) {this.defaultTenantProvider = defaultTenantProvider;return this;}public boolean isEnableLogSqlExecutionTime() {return enableLogSqlExecutionTime;}public void setEnableLogSqlExecutionTime(boolean enableLogSqlExecutionTime) {this.enableLogSqlExecutionTime = enableLogSqlExecutionTime;}public Map<Class<?>, SessionFactory> getSessionFactories() {return sessionFactories;}public AbstractEngineConfiguration setSessionFactories(Map<Class<?>, SessionFactory> sessionFactories) {this.sessionFactories = sessionFactories;return this;}public String getDatabaseSchemaUpdate() {return databaseSchemaUpdate;}public AbstractEngineConfiguration setDatabaseSchemaUpdate(String databaseSchemaUpdate) {this.databaseSchemaUpdate = databaseSchemaUpdate;return this;}public boolean isUseLockForDatabaseSchemaUpdate() {return useLockForDatabaseSchemaUpdate;}public AbstractEngineConfiguration setUseLockForDatabaseSchemaUpdate(boolean useLockForDatabaseSchemaUpdate) {this.useLockForDatabaseSchemaUpdate = useLockForDatabaseSchemaUpdate;return this;}public boolean isEnableEventDispatcher() {return enableEventDispatcher;}public AbstractEngineConfiguration setEnableEventDispatcher(boolean enableEventDispatcher) {this.enableEventDispatcher = enableEventDispatcher;return this;}public FlowableEventDispatcher getEventDispatcher() {return eventDispatcher;}public AbstractEngineConfiguration setEventDispatcher(FlowableEventDispatcher eventDispatcher) {this.eventDispatcher = eventDispatcher;return this;}public List<FlowableEventListener> getEventListeners() {return eventListeners;}public AbstractEngineConfiguration setEventListeners(List<FlowableEventListener> eventListeners) {this.eventListeners = eventListeners;return this;}public Map<String, List<FlowableEventListener>> getTypedEventListeners() {return typedEventListeners;}public AbstractEngineConfiguration setTypedEventListeners(Map<String, List<FlowableEventListener>> typedEventListeners) {this.typedEventListeners = typedEventListeners;return this;}public List<EventDispatchAction> getAdditionalEventDispatchActions() {return additionalEventDispatchActions;}public AbstractEngineConfiguration setAdditionalEventDispatchActions(List<EventDispatchAction> additionalEventDispatchActions) {this.additionalEventDispatchActions = additionalEventDispatchActions;return this;}public void initEventDispatcher() {if (this.eventDispatcher == null) {this.eventDispatcher = new FlowableEventDispatcherImpl();}initAdditionalEventDispatchActions();this.eventDispatcher.setEnabled(enableEventDispatcher);initEventListeners();initTypedEventListeners();}protected void initEventListeners() {if (eventListeners != null) {for (FlowableEventListener listenerToAdd : eventListeners) {this.eventDispatcher.addEventListener(listenerToAdd);}}}protected void initAdditionalEventDispatchActions() {if (this.additionalEventDispatchActions == null) {this.additionalEventDispatchActions = new ArrayList<>();}}protected void initTypedEventListeners() {if (typedEventListeners != null) {for (Map.Entry<String, List<FlowableEventListener>> listenersToAdd : typedEventListeners.entrySet()) {// 从给定字符串中提取类型FlowableEngineEventType[] types = FlowableEngineEventType.getTypesFromString(listenersToAdd.getKey());for (FlowableEventListener listenerToAdd : listenersToAdd.getValue()) {this.eventDispatcher.addEventListener(listenerToAdd, types);}}}}public boolean isLoggingSessionEnabled() {return loggingListener != null;}public LoggingListener getLoggingListener() {return loggingListener;}public void setLoggingListener(LoggingListener loggingListener) {this.loggingListener = loggingListener;}public Clock getClock() {return clock;}public AbstractEngineConfiguration setClock(Clock clock) {this.clock = clock;return this;}public ObjectMapper getObjectMapper() {return objectMapper;}public AbstractEngineConfiguration setObjectMapper(ObjectMapper objectMapper) {this.objectMapper = objectMapper;return this;}public int getMaxLengthString() {if (maxLengthStringVariableType == -1) {if ("oracle".equalsIgnoreCase(databaseType)) {return DEFAULT_ORACLE_MAX_LENGTH_STRING;} else {return DEFAULT_GENERIC_MAX_LENGTH_STRING;}} else {return maxLengthStringVariableType;}}public int getMaxLengthStringVariableType() {return maxLengthStringVariableType;}public AbstractEngineConfiguration setMaxLengthStringVariableType(int maxLengthStringVariableType) {this.maxLengthStringVariableType = maxLengthStringVariableType;return this;}public PropertyDataManager getPropertyDataManager() {return propertyDataManager;}public Duration getLockPollRate() {return lockPollRate;}public AbstractEngineConfiguration setLockPollRate(Duration lockPollRate) {this.lockPollRate = lockPollRate;return this;}public Duration getSchemaLockWaitTime() {return schemaLockWaitTime;}public void setSchemaLockWaitTime(Duration schemaLockWaitTime) {this.schemaLockWaitTime = schemaLockWaitTime;}public AbstractEngineConfiguration setPropertyDataManager(PropertyDataManager propertyDataManager) {this.propertyDataManager = propertyDataManager;return this;}public PropertyEntityManager getPropertyEntityManager() {return propertyEntityManager;}public AbstractEngineConfiguration setPropertyEntityManager(PropertyEntityManager propertyEntityManager) {this.propertyEntityManager = propertyEntityManager;return this;}public ByteArrayDataManager getByteArrayDataManager() {return byteArrayDataManager;}public AbstractEngineConfiguration setByteArrayDataManager(ByteArrayDataManager byteArrayDataManager) {this.byteArrayDataManager = byteArrayDataManager;return this;}public ByteArrayEntityManager getByteArrayEntityManager() {return byteArrayEntityManager;}public AbstractEngineConfiguration setByteArrayEntityManager(ByteArrayEntityManager byteArrayEntityManager) {this.byteArrayEntityManager = byteArrayEntityManager;return this;}public TableDataManager getTableDataManager() {return tableDataManager;}public AbstractEngineConfiguration setTableDataManager(TableDataManager tableDataManager) {this.tableDataManager = tableDataManager;return this;}public List<EngineDeployer> getDeployers() {return deployers;}public AbstractEngineConfiguration setDeployers(List<EngineDeployer> deployers) {this.deployers = deployers;return this;}public List<EngineDeployer> getCustomPreDeployers() {return customPreDeployers;}public AbstractEngineConfiguration setCustomPreDeployers(List<EngineDeployer> customPreDeployers) {this.customPreDeployers = customPreDeployers;return this;}public List<EngineDeployer> getCustomPostDeployers() {return customPostDeployers;}public AbstractEngineConfiguration setCustomPostDeployers(List<EngineDeployer> customPostDeployers) {this.customPostDeployers = customPostDeployers;return this;}public boolean isEnableConfiguratorServiceLoader() {return enableConfiguratorServiceLoader;}public AbstractEngineConfiguration setEnableConfiguratorServiceLoader(boolean enableConfiguratorServiceLoader) {this.enableConfiguratorServiceLoader = enableConfiguratorServiceLoader;return this;}public List<EngineConfigurator> getConfigurators() {return configurators;}public AbstractEngineConfiguration addConfigurator(EngineConfigurator configurator) {if (configurators == null) {configurators = new ArrayList<>();}configurators.add(configurator);return this;}/*** @返回所有{@link EngineConfigurator}实例。将仅包含引擎初始化后的值.* 否则,请使用{@link#getConfigurator()}或{@link#addConfigurator(EngineConfigurator)}方法.*/public List<EngineConfigurator> getAllConfigurators() {return allConfigurators;}public AbstractEngineConfiguration setConfigurators(List<EngineConfigurator> configurators) {this.configurators = configurators;return this;}public EngineConfigurator getIdmEngineConfigurator() {return idmEngineConfigurator;}public AbstractEngineConfiguration setIdmEngineConfigurator(EngineConfigurator idmEngineConfigurator) {this.idmEngineConfigurator = idmEngineConfigurator;return this;}public EngineConfigurator getEventRegistryConfigurator() {return eventRegistryConfigurator;}public AbstractEngineConfiguration setEventRegistryConfigurator(EngineConfigurator eventRegistryConfigurator) {this.eventRegistryConfigurator = eventRegistryConfigurator;return this;}public AbstractEngineConfiguration setForceCloseMybatisConnectionPool(boolean forceCloseMybatisConnectionPool) {this.forceCloseMybatisConnectionPool = forceCloseMybatisConnectionPool;return this;}public boolean isForceCloseMybatisConnectionPool() {return forceCloseMybatisConnectionPool;}
}
查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. CDH客户端部署

    目录 1、下载cdh parcels包 2. 配置环境变量 3. 在客户端服务器上配置hosts文件 4.参考资料 1、下载cdh parcels包 下载 CDH-5.9.1-1.cdh5.9.1.p0.4-el7.parcel mkdir -p /opt/cloudera/parcels cd /opt/cloudera/parcels 上传刚才的的parcel包至/opt/cloudera/parcels目录…...

    2024/4/14 2:48:21
  2. (保安站岗)树形DP板子

    状态转移方程1&#xff1a; f[t][0]:如果这个节点被控制并且有一个守卫&#xff0c;那么这个节点的代价 就是 f[t][0] min(f[v][0], min(f[v][1], f[v][2])); 因为这个点已经被控制了&#xff0c;已经是妈祖要求的了&#xff0c;所以对于他的儿子已经没有要求了在儿子的 3中选…...

    2024/5/2 7:24:15
  3. Numpy基础(一)

    Numpy基础 一、Numpy是什么 数据处理、数据分析 两种基本对象&#xff1a; ndarray&#xff1a;存储单一数据类型的多维数组 ufunc&#xff1a;对数组进行处理的函数 特点 ndarray是快速运算和节省空间的多维数组&#xff0c;提供数组话的算术运算和高级的广播功能使用标准数…...

    2024/5/1 15:39:35
  4. 空间复杂度(学习总结)

    什么是空间复杂度呢&#xff1f; 空间复杂度是对一个算法在运行过程中占用内存空间大小的量度&#xff0c;记做S(n)O(f(n)。 空间复杂度(Space Complexity)记作S(n) 依然使用大O来表示。利用程序的空间复杂度&#xff0c;可以对程序运行中需要多少内存有个预先估计。 关注空间…...

    2024/5/1 9:55:11
  5. 面试腾讯Android高级开发岗位被血虐,到底具有怎样的技术才算高级水平?

    前几天我朋友跟我吐苦水&#xff0c;这波面试又把他打击到了&#xff0c;做了6年Android开发。。。 下面这条招聘是在腾讯招聘官网截图下来的&#xff0c;首先我们对高级水平下一个定义吧&#xff0c;那它应该是对标这个职级该有的能力 什么样的工程师才能算高级&#xff1f;至…...

    2024/5/1 6:59:13
  6. MATLAB学习的几种途径

    途径一&#xff1a;去MATLAB官网学习 MATLAB中国官网&#xff1a; MATLAB Documentation - MathWorks 中国https://ww2.mathworks.cn/help/matlab/index.html官网上有详细的讲义&#xff0c;适合新手学习MATLAB 途径二&#xff1a;在CSDN上学习 推荐一名自己看过的&#xff…...

    2024/5/1 5:46:42
  7. 如何使用QSS、QRC美化PySide6界面

    什么是QSS与QRC QRC: 与应用程序关联的资源以 .qrc 文件指定&#xff0c;.qrc 文件是一种基于 XML 的文件格式&#xff0c;该文件格式列出了磁盘上的文件&#xff0c;并可以选择为它们分配一个资源名称&#xff0c;应用程序必须使用该资源名称来访问该资源。 QSS: 全称 Qt Sty…...

    2024/5/1 13:14:37
  8. MySQL-6-MySQL图形化管理工具

    MySQL图形化管理工具极大地方便了数据库的操作与管理&#xff0c;常用的图形化管理工具有&#xff1a; MySQL Workbench、phpMyAdmin、Navicat Preminum、MySQLDumper、SQLyog、dbeaver、MySQL ODBC Connector。 工具1. MySQL Workbench MySQL官方提供的图形化管理…...

    2024/5/1 18:15:22
  9. SUSE Enterprise Storage delivers best CephFS benchmark on Arm

    SUSE 企业存储在 Arm 上提供最佳 CephFS 基准 自 2006 年推出以来&#xff0c;Ceph 主要用于性能不是最关键方面的容量密集型用例。 由于该技术具有许多吸引人的功能&#xff0c;因此一直希望将 Ceph 的使用扩展到高性能计算等领域。 HPC 环境中的 Ceph 部署通常作为一个活动存…...

    2024/5/1 7:40:24
  10. 深入分析Android Handler消息机制

    概述 Handler是Android消息机制的上层接口。通过它可以轻松地将一个任务切换到Handler所在的线程中去执行。通常情况下&#xff0c;Handler的使用场景就是 更新UI。 Handler的使用 在子线程中&#xff0c;进行耗时操作&#xff0c;执行完操作后&#xff0c;发送消息&#xf…...

    2024/5/1 20:51:03
  11. 使用mdadm创建RAID

    文章目录创建RAID10命令参考创建RAID10 创建raid10至少需要4块硬盘&#xff0c;先将两块硬盘组成raid0&#xff0c;然后将两组raid1组合成raid0, 存储一份数据时&#xff0c;raid0内的数据是均分的&#xff0c;raid1的数据是镜像的。 命令 # 创建raid10盘 mdadm --create --…...

    2024/5/1 8:08:02
  12. 蓝桥杯:回文日期(超详解)

    题目&#xff1a;2020年春节期间&#xff0c;有一个特殊的日期引起了大家的注意&#xff1a;2020年2月2日。因为如果将这个 R 期按“ ymmdd ”沿格式写成一一个8位数是20200202恰好是一个回文数。我们称这样沿旧期是回文日期。 有人表示20200202是“千年一遇”的特殊日子。对此…...

    2024/5/1 7:58:37
  13. redis 入门

    前言 Redis 是一个开源&#xff0c;内存中的数据结构存储系统&#xff0c;它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构&#xff0c;如 字符串&#xff08;strings&#xff09;&#xff0c; 散列&#xff08;hashes&#xff09;&#xff0c; 列表&#xff…...

    2024/5/1 15:30:47
  14. HTML5 - CSS文字属性各种细节处理,以及CSS三种引入方式区别

    文章目录CSS字体属性字体系列字体大小字体粗细表格总结文字样式注意字体复合属性注意字体属性总结&#xff08;表格&#xff09;CSS文本属性文本颜色对齐文本装饰文本知识点文本缩进行间距文本属性总结&#xff08;表格&#xff09;CSS的引入方式CSS的三种样式表1.行内样式表&a…...

    2024/5/1 10:32:29
  15. 【面试问题总结】5

    #和$有什么区别&#xff1f; $在将参数拼接到sql语句里面时会预先编译&#xff0c;可以防止sql注入。而#不会预编译&#xff0c;直接将参数拼接到sql语句中 Java多线程 创建线程池有哪几种方式&#xff1f;方法之间区别 两种创建方式。 1、Executors创建方式  但是阿里开发手…...

    2024/5/1 11:35:36
  16. Java学习笔记-类、对象、方法

    类 一个类可以包含以下类型变量&#xff1a; 局部变量&#xff1a; 在方法、构造方法或者语句块中定义的变量被称为局部变量。 变量声明和初始化都是在方法中&#xff0c;方法结束后&#xff0c;变量就会自动销毁。 成员变量&#xff1a; 成员变量定义在类中&#xff0c;但是在…...

    2024/5/1 20:57:18
  17. 连续两周爬大蜀山能否减肥10斤测试记录

    2022年01月13日-2022年01月26日连续两周登大蜀山记录打卡记录01-2022011302-2022011403-2022011504-2022011605-2022011706-2022011807-2022011908-2022012009-2022012110-2022012211-2022012312-2022012413-2022012514-20220126测试结果测试总结打卡记录 01-20220113 爬到山…...

    2024/5/1 5:29:44
  18. 树状数组 (及其应用~~~)

    菜鸡冒泡~~ 有锅请各位dalao指出 ~~ first of all 先交代故事发生的背景......... 关于lowbit的函数介绍&#xff08;so easy&#xff09; lowbit是找最后一位是一的位数 ●在计算机中&#xff0c;负数的存储为&#xff08;以八进制为例&#xff0c;-10 就是10001010※第一位…...

    2024/5/1 9:46:35
  19. 一些服务机器人厂家建图和导航参数

    文章目录1.云迹底盘1.1 水滴22. 思岚底盘2.1 思岚阿波罗底盘2.2 思岚赫尔墨斯底盘3. EAI底盘4. 易行底盘1.云迹底盘 1.1 水滴2 2. 思岚底盘 2.1 思岚阿波罗底盘 2.2 思岚赫尔墨斯底盘 3. EAI底盘 4. 易行底盘...

    2024/5/1 11:21:51
  20. CI/CD是什么?如何通过谷歌云实现CI/CD?

    CI/CD 是一种通过在应用开发阶段引入自动化来频繁向客户交付应用的方法。CI/CD 的核心概念是持续集成、持续交付。 CI 持续集成&#xff08;Continuous Integration&#xff09; 现代应用开发需要让多位开发人员同时处理同一应用的不同功能&#xff0c;而这些开发人员分别写的…...

    2024/5/1 13:13:24

最新文章

  1. 2024.5.5 机器学习周报

    引言 Abstract 文献阅读 1、题目 SuperGlue: Learning Feature Matching with Graph Neural Networks 2、引言 本文介绍了SuperGlue&#xff0c;这是一种神经网络&#xff0c;它通过联合寻找对应关系并拒绝不匹配的点来匹配两组局部特征。通过求解一个可微的最优运输问题…...

    2024/5/2 8:54:26
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. docker进行jenkins接口自动化测试持续集成实战

    文章目录 一、接口功能自动化测试项目源码讲解二、接口功能自动化测试运行环境配置1、下载jdk&#xff0c;maven&#xff0c;git&#xff0c;allure并配置对应的环境变量2、使用docker安装jenkins3、配置接口测试的运行时环境选择对应节点4、jenkins下载插件5、jenkins配置环境…...

    2024/5/1 13:12:35
  4. ChatGPT 赚钱初学者指南(上)

    原文&#xff1a;The Beginner’s Guide to Earning Money Online with ChatGPT 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第一章&#xff1a;理解基础知识 什么是 ChatGPT&#xff1f; 在人工智能与人类对话相遇的数字织锦中&#xff0c;ChatGPT 作为一个突出…...

    2024/5/1 13:16:25
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/5/1 17:30:59
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/30 18:14:14
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/29 2:29:43
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/30 18:21:48
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/28 1:28:33
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/30 9:43:09
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/25 18:39:16
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/28 1:34:08
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/29 20:46:55
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/30 22:21:04
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/5/1 4:32:01
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/27 23:24:42
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/28 5:48:52
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/30 9:42:22
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/30 9:43:22
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/30 9:42:49
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57