Skip to content

Commit

Permalink
compatible with file.conf and registry.conf (apache#6811)
Browse files Browse the repository at this point in the history
  • Loading branch information
lyl2008dsg committed Sep 7, 2024
1 parent 145b33c commit 9203551
Show file tree
Hide file tree
Showing 9 changed files with 233 additions and 1 deletion.
4 changes: 4 additions & 0 deletions common/src/main/java/org/apache/seata/common/Constants.java
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,10 @@ public interface Constants {
* The constant BEAN_NAME_SPRING_APPLICATION_CONTEXT_PROVIDER
*/
String BEAN_NAME_SPRING_APPLICATION_CONTEXT_PROVIDER = "springApplicationContextProvider";
/**
* The constant BEAN_NAME_SEATA_FILE_CONFIGURATION_PROVIDER
*/
String BEAN_NAME_SEATA_FILE_CONFIGURATION_PROVIDER = "seataFileConfigurationProvider";
/**
* The constant BEAN_NAME_SPRING_FENCE_CONFIG
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,5 +38,10 @@
<version>${project.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,15 @@
*/
package org.apache.seata.spring.boot.autoconfigure;

import org.apache.seata.spring.boot.autoconfigure.provider.SeataFileConfigurationProvider;
import org.apache.seata.spring.boot.autoconfigure.provider.SpringApplicationContextProvider;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

import static org.apache.seata.common.Constants.BEAN_NAME_SEATA_FILE_CONFIGURATION_PROVIDER;
import static org.apache.seata.common.Constants.BEAN_NAME_SPRING_APPLICATION_CONTEXT_PROVIDER;
import static org.apache.seata.spring.boot.autoconfigure.StarterConstants.SEATA_PREFIX;

Expand All @@ -37,4 +39,10 @@ public class SeataCoreAutoConfiguration {
public SpringApplicationContextProvider springApplicationContextProvider() {
return new SpringApplicationContextProvider();
}

@Bean(BEAN_NAME_SEATA_FILE_CONFIGURATION_PROVIDER)
@ConditionalOnMissingBean(name = {BEAN_NAME_SEATA_FILE_CONFIGURATION_PROVIDER})
public SeataFileConfigurationProvider seataFileConfigurationProvider() {
return new SeataFileConfigurationProvider();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
package org.apache.seata.spring.boot.autoconfigure.provider;

import org.apache.commons.lang.StringUtils;
import org.apache.seata.common.util.CollectionUtils;
import org.apache.seata.config.FileConfiguration;
import org.apache.seata.config.ConfigurationFactory;
import org.apache.seata.config.file.FileConfig;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.PropertiesPropertySource;

import java.util.*;

import static org.apache.seata.common.ConfigurationKeys.FILE_ROOT_PREFIX_CONFIG;
import static org.apache.seata.common.ConfigurationKeys.*;

public class SeataFileConfigurationProvider implements ApplicationContextAware, ApplicationListener<ContextRefreshedEvent> {

private ApplicationContext applicationContext;

// Prefix list for filtering configuration keys
List<String> prefixList = Arrays.asList(FILE_ROOT_PREFIX_CONFIG, FILE_ROOT_PREFIX_REGISTRY, SERVER_PREFIX,
STORE_PREFIX, METRICS_PREFIX, TRANSPORT_PREFIX);

@Override
public void setApplicationContext(ApplicationContext applicationContext) {
this.applicationContext = applicationContext;
}

@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
// Only process if the event is for the current application context
if (event.getApplicationContext().equals(this.applicationContext)) {
ConfigurableEnvironment environment = (ConfigurableEnvironment) applicationContext.getEnvironment();
loadAndAddConfigurations(environment);
}
}

/**
* Loads configurations from file.conf and registry.conf and adds them to the Spring environment.
*
* @param environment the Spring environment
*/
private void loadAndAddConfigurations(ConfigurableEnvironment environment) {
// Get configurations from file.conf and registry.conf
FileConfiguration configuration = ConfigurationFactory.getOriginFileInstanceRegistry();
FileConfig fileConfig = configuration.getFileConfig();
Map<String, Object> configs = fileConfig.getAllConfig();

if (CollectionUtils.isNotEmpty(configs)) {
// Optionally merge other configurations
Optional<FileConfiguration> originFileInstance = ConfigurationFactory.getOriginFileInstance();
originFileInstance.ifPresent(fileConfiguration ->
configs.putAll(fileConfiguration.getFileConfig().getAllConfig())
);

// Convert and filter configurations based on prefix
Properties properties = new Properties();
configs.forEach((k, v) -> {
if (v instanceof String && StringUtils.isNotEmpty((String) v)) {
if (prefixList.stream().anyMatch(k::startsWith)) {
properties.put(SEATA_FILE_PREFIX_ROOT_CONFIG + k, v);
}
}
});

// Add the properties to the environment with the lowest priority
environment.getPropertySources().addLast(new PropertiesPropertySource("seataFileConfig", properties));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,10 @@ public Configuration provide(Configuration originalConfiguration) {
// 1. Get config value from the system property
result = originalConfiguration.getConfigFromSys(rawDataId);

if (result == null) {
result = originalConfiguration.getConfig(rawDataId);
}

if (result == null) {
String dataId = convertDataId(rawDataId);

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package org.apache.seata.spring.boot.autoconfigure;

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.ApplicationContext;
import org.springframework.core.env.Environment;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit.jupiter.SpringExtension;

import static org.junit.jupiter.api.Assertions.assertEquals;

@ExtendWith(SpringExtension.class)
@SpringBootTest(classes = SeataCoreAutoConfiguration.class)
@TestPropertySource(locations = "classpath:application-test.properties")
public class SeataCoreAutoConfigurationTest {

@Autowired
private ApplicationContext applicationContext;

@Autowired
private Environment environment;

@Test
public void testSeataPropertiesLoaded() {
// default file.conf
String txServiceGroup = environment.getProperty("seata.store.db.url");
assertEquals("jdbc:mysql://127.0.0.1:3306/seata?rewriteBatchedStatements=true&configType=file", txServiceGroup, "The transaction service group should be correctly loaded from configuration");


// overridden by application-test.properties
String registryType = environment.getProperty("seata.config.type");
assertEquals("file", registryType, "The config type should be file");

// overridden by application-test.properties
String seataNamespaces = environment.getProperty("seata.config.nacos.namespace");
assertEquals("seata-test-application.yml", seataNamespaces, "The config type should be file");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ seata.config.apollo.apollo-config-service=fff
seata.config.etcd3.server-addr=aaa
seata.config.etcd3.key=bbb

seata.config.nacos.namespace=ddd
seata.config.nacos.namespace=seata-test-application.yml
seata.config.nacos.server-addr=aaa
seata.config.nacos.group=ccc
seata.config.nacos.username=eee
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

#reduce delay for test
## transaction log store, only used in seata-server
store {
## store mode: file、db
mode = "file"

## file store property
file {
## store location dir
dir = "sessionStore"
}

## database store property
db {
## the implement of javax.sql.DataSource, such as DruidDataSource(druid)/BasicDataSource(dbcp) etc.
datasource = "dbcp"
## mysql/oracle/h2/oceanbase etc.
dbType = "mysql"
driverClassName = "com.mysql.jdbc.Driver"
## if using mysql to store the data, recommend add rewriteBatchedStatements=true in jdbc connection param
url = "jdbc:mysql://127.0.0.1:3306/seata?rewriteBatchedStatements=true"
user = "mysql"
password = "mysql"
}
}
server {
recovery {
#schedule committing retry period in milliseconds
committingRetryPeriod = 100
#schedule asyn committing retry period in milliseconds
asynCommittingRetryPeriod = 100
#schedule rollbacking retry period in milliseconds
rollbackingRetryPeriod = 100
#schedule timeout retry period in milliseconds
timeoutRetryPeriod = 100
}
undo {
logSaveDays = 2
#schedule delete expired undo_log in milliseconds
logDeletePeriod = 86400000
}
}
## metrics settings
metrics {
enabled = true
registryType = "compact"
# multi exporters use comma divided
exporterList = "prometheus"
exporterPrometheusPort = 9898
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

config {
type = "file"

file {
name = "file.conf"
}
nacos {
application = "seata-server"
serverAddr = "127.0.0.1:8848"
namespace = "seata-test"
cluster = "default"
}
}

0 comments on commit 9203551

Please sign in to comment.