Netflix archaius动态配置工具使用

1、解决问题和使用场景

很多项目有配置改变了而不需要重启项目这样的需求,比较暴力的解决方法是写一个定时任务轮询去获取配置信息,然后可以全局获取这些实时更新的配置信息。Netflix archaius针对这一使用场景,对数据源的获取、获取策略(主要是定时策略)和获取全局配置信息进行了封装,实现了动态获取配置数据。

2、使用例子

需要完成数据源的获取方式,获取方式可以是任意方式,比如文件、数据库、zk、consul等等。本例子主要是针对文件获取方式,其它方式可以类推。

数据源实现

数据源实现需要继承PolledConfigurationSource中的poll方法,实现如下:

public class FillConfigurationSource implements PolledConfigurationSource {
    @Override
    public PollResult poll(boolean b, Object o) {
        System.out.println("polling.....");
        FileInputStream in = null;
        try {
            in = new FileInputStream("you file path");
            Properties properties = new Properties();
            properties.load(in);
            Set keys = properties.keySet();
            Map map = new HashMap<>();
            for (Object k : keys) {
                map.put((String) k, properties.get(k));
            }
            return PollResult.createFull(map);
        } catch (IOException e) {

        } finally {
            if (in != null)
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
        }
        return null;
    }
} 
  

定时策略

archaius定时策略有一个默认实现FixedDelayPollingScheduler,此默认实现有两个配置,分别是启动延时时间(archaius.fixedDelayPollingScheduler.initialDelayMills 默认为30秒)和间隔获取配置时间(archaius.fixedDelayPollingScheduler.delayMills默认为60秒),这些配置的值是通过System.getProperty获取,当然也可以通过System.setProperty设置默认的值。默认实现足以满足大部分的需求,如果想定制定时策略可以实现AbstractPollingScheduler接口的schedule方法,官网的例子如下:

public class MyScheduler extends AbstractPollingScheduler {
    // ...
    @Override
    protected synchronized void schedule(Runnable runnable) {
        // schedule the runnable
    }

    @Override
    public void stop() {
        // stop the scheduler
    }
}

运行

我们来看看运行代码

private void startPolling() {
    System.setProperty("archaius.fixedDelayPollingScheduler.initialDelayMills", "1000");
    System.setProperty("archaius.fixedDelayPollingScheduler.delayMills", "2000");
    PolledConfigurationSource source = new FillConfigurationSource();
    AbstractPollingScheduler scheduler = new FixedDelayPollingScheduler();
    DynamicConfiguration configuration = new DynamicConfiguration(source, scheduler);
    ConfigurationManager.install(configuration);

    new Thread(new Runnable() {
        @Override
        public void run() {
            while (true) {
                try {
                    Thread.sleep(1000 * 10);
                    DynamicStringProperty myprop = DynamicPropertyFactory.getInstance().getStringProperty("uttp", "default");
                    System.out.println("-----vaule:" + myprop.getValue());
                } catch (Exception e) {

                }
            }
        }
    }).start();
}

开始值文件中uttp的值为s2,当文件中的uttp值改为3时,得到的值也改变了,结果如下

polling…..
—–vaule:s2
polling…..
polling…..
polling…..
polling…..
polling…..
—–vaule:s3

你可能感兴趣的:(java)