dynamicstringproperty dp = dynamicpropertyfactory.getinstance.getstringproperty;
dynamicpropertyfactory.getinstance
获取dynamicpropertyfactory的一个饿汉单例,并且懒加载一个dynamicpropertysupport单例作为其属性。
同时初始化dynamicpropertysupport,通过configurationmanager.getconfiginstance获取当前系统的配置config赋给dynamicpropertysupport,通过setdirect方法对config添加监听器。
配置变更时出发监听器
config发生变更时,比如set动作时会调用fireevent方法,然后会遍历listenners集合去执行listenner的configurationchanged方法,然后会走到expandedconfigurationlistenneradapter的重写方法,里面注入dynamicproperty的静态内部类dynamicpropertylistenner,然后去执行所有的回调方法。
关键点:
1.dynamicpropertyfactory.getinstance.getstringproperty每次执行都会new一个dynamicproperty对象,但是new出来对象的get方法都是调同一个dynamicproperty的get方法,只不过类型做了一下转换包装。通过抽象父类propertywrapper将每个key唯一对应的dynamicproperty给注入进去,最后get实际调用的是注入进去的prop的get方法,只不过返回的时候做了返回类型包装。
2.配置源变更实时读取
可以通过以下方式实时更新config,更新config后,config会通知已注册的监听器
1)多配置源指定
目前Netflix内置了url和jdbc两种数据源,也可以通过重写配置自己的数据源,比如配置文件数据源
polledconfigurationsource pcfs=new jdbcconfigurationsource(DataSource,sql,sql参数);
2)定时读取配置源定时器
abstractpollingscheduler ps=new fixeddelaypollingscheduler(延迟执行时间,间隔时间,删除是否需要同步);
3)实例化并启动定时器,并将读取结果实时更新到config对象
return new configurationwithpollingsource(config,pcfs,ps);