使用Archaius监听文件变化

package com.teriste.database;

import com.netflix.config.AbstractPollingScheduler;
import com.netflix.config.ConfigurationManager;
import com.netflix.config.DynamicConfiguration;
import com.netflix.config.FixedDelayPollingScheduler;
import com.netflix.config.PollResult;
import com.netflix.config.PolledConfigurationSource;

import org.springframework.stereotype.Component;

import java.io.IOException;
import java.io.InputStream;
import java.util.Map;
import java.util.Properties;

import javax.annotation.PostConstruct;

@Component
public class DataSourceDynamicActive {

    private static final DebugLog DEBUG_LOG = LogFactory.getDebugLog(DataSourceDynamicActive.class);

    @PostConstruct
    public void init(){
    		// 循环读取配置文件
        PolledConfigurationSource source = newConfigurationSource();
        // 延迟读取的时长,可以直接从配置文件获取或固定值
        String delayMills = System.getProperty("archaius.fixedDelayPollingScheduler.delayMills");
        // 定时轮询读取文件内容
        AbstractPollingScheduler scheduler = new FixedDelayPollingScheduler(1000,Integer.parseInt(delayMills),false);
        // 加入配置管理器
        DynamicConfiguration configuration = new DynamicConfiguration(source,scheduler);
        ConfigurationManager.install(configuration);
    }

    // 具体轮询业务逻辑
    private PolledConfigurationSource newConfigurationSource(){
        return (initial, checkPoint) -> {
            Properties properties = new Properties();
            try (InputStream is = DataSourceDynamicActive.class.getClassLoader().getResourceAsStream("jdbc.properties")) {
                properties.load(is);
            } catch (IOException e) {
                String text = "Fail to read \"jdbc.properties\".";
                DEBUG_LOG.error(text);
            }
            return PollResult.createFull((Map)properties);
        };
    }

}
// 动态获取配置,switchDataSource是监听到文件中defaultDataSource变化时执行的业务逻辑
DynamicPropertyFactory.getInstance().getStringProperty("defaultDataSource", "dataSource1", this::switchDataSource);

原来使用的archaius默认方式不生效的原因是pom依赖中删除了archaius的jar

System.setProperty("archaius.configurationSource.additionalUrls", jdbcProp);
System.setProperty("archaius.fixedDelayPollingScheduler.initialDelayMills", "1000");
System.setProperty("archaius.fixedDelayPollingScheduler.delayMills", delay);
<dependency>
   <groupId>com.netflix.archaius</groupId>
   <artifactId>archaius-core</artifactId>
   <version>0.7.7</version>
</dependency>

如果一个服务启动了多个archaius配置监听对象,会报错,可以通过下面的方式加入新的配置监听器

PolledConfigurationSource source = newConfigurationSource();
// 延迟读取的时长,可以直接从配置文件获取或固定值
String delayMills = System.getProperty("archaius.fixedDelayPollingScheduler.delayMills");
// 定时轮询读取文件内容
AbstractPollingScheduler scheduler = new FixedDelayPollingScheduler(1000,Integer.parseInt(delayMills),false);
// 加入配置管理器
DynamicConfiguration dynamicConfig = new DynamicConfiguration(source,scheduler);
ConcurrentCompositeConfiguration finalConfig = new ConcurrentCompositeConfiguration();
finalConfig.addConfiguration(dynamicConfig);
if (!ConfigurationManager.isConfigurationInstalled()) {
    ConfigurationManager.install(finalConfig);
} else {
    ConcurrentCompositeConfiguration config =
        (ConcurrentCompositeConfiguration) ConfigurationManager.getConfigInstance();
    config.addConfiguration(dynamicConfig);
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值