源碼閱讀—定時拉取配置
AbstractConfigRepository
- 提供模板方法trySync(),具體實現交由子類
- 管理監聽者集合(添加,刪除)
- fire!!通知監聽者拉取配置改變狀態
protected void fireRepositoryChange(String namespace, Properties newProperties) {
for (RepositoryChangeListener listener : m_listeners) {
try {
listener.onRepositoryChange(namespace, newProperties);
} catch (Throwable ex) {
Tracer.logError(ex);
logger.error("Failed to invoke repository change listener {}", listener.getClass(), ex);
}
}
}
RemoteConfigRepository
static {
m_executorService = Executors.newScheduledThreadPool(1,
ApolloThreadFactory.create("RemoteConfigRepository", true));
}
單線程維持調用
if (!m_loadConfigRateLimiter.tryAcquire(5, TimeUnit.SECONDS)) {
//wait at most 5 seconds
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
}
}
很有意思防止快速重試設置了等待時間
==assembleQueryConfigUrl()==組裝請求的URL(根據appid,cluster,namespace)
Transaction transaction = Tracer.newTransaction("Apollo.ConfigService", "queryConfig");
transaction.addData("Url", url);
開啓事務,完成查詢之後返回結果
if (previous != current) {
logger.debug("Remote Config refreshed!");
m_configCache.set(current);
this.fireRepositoryChange(m_namespace, this.getConfig());
}
if (current != null) {
Tracer.logEvent(String.format("Apollo.Client.Configs.%s", current.getNamespaceName()),
current.getReleaseKey());
}
將結果和本地的數據進行比較如果不同,出發fire!!將配置更新到所有監聽者.
長輪詢
長輪詢的開啓入口在構造方法,調用下面的方法進入長輪詢
private void scheduleLongPollingRefresh() {
remoteConfigLongPollService.submit(m_namespace, this);
}
完成長輪詢之後執行通知繼續新一輪的長輪詢
for (RemoteConfigRepository remoteConfigRepository : toBeNotified) {
try {
remoteConfigRepository.onLongPollNotified(lastServiceDto, remoteMessages);
} catch (Throwable ex) {
Tracer.logError(ex);
}
}