use of com.tencent.polaris.api.plugin.configuration.ConfigFileResponse in project polaris-java by polarismesh.
the class RemoteConfigFileRepo method doPull.
@Override
protected void doPull() {
long startTime = System.currentTimeMillis();
ConfigFile pullConfigFileReq = new ConfigFile(configFileMetadata.getNamespace(), configFileMetadata.getFileGroup(), configFileMetadata.getFileName());
pullConfigFileReq.setVersion(notifiedVersion.get());
LOGGER.info("[Config] start pull config file. config file = {}, version = {}", configFileMetadata, notifiedVersion.get());
int retryTimes = 0;
while (retryTimes < 3) {
try {
ConfigFileResponse response = configFileConnector.getConfigFile(pullConfigFileReq);
retryPolicy.success();
// 打印请求信息
long pulledConfigFileVersion = response.getConfigFile() != null ? response.getConfigFile().getVersion() : -1;
LOGGER.info("[Config] pull config file finished. config file = {}, code = {}, version = {}, duration = {} ms", configFileMetadata, response.getCode(), pulledConfigFileVersion, System.currentTimeMillis() - startTime);
if (response.getCode() == ServerCodes.EXECUTE_SUCCESS) {
ConfigFile pulledConfigFile = response.getConfigFile();
// 本地配置文件落后,更新内存缓存
if (remoteConfigFile.get() == null || pulledConfigFile.getVersion() >= remoteConfigFile.get().getVersion()) {
ConfigFile copiedConfigFile = deepCloneConfigFile(pulledConfigFile);
remoteConfigFile.set(copiedConfigFile);
// 配置有更新,触发回调
fireChangeEvent(copiedConfigFile.getContent());
}
return;
}
// 远端没有此配置文件
if (response.getCode() == ServerCodes.NOT_FOUND_RESOURCE) {
LOGGER.warn("[Config] config file not found, please check whether config file released. {}", configFileMetadata);
// 删除配置文件
if (remoteConfigFile.get() != null) {
remoteConfigFile.set(null);
// 删除配置文件也需要触发通知
fireChangeEvent(null);
}
return;
}
// 预期之外的状态码,重试
LOGGER.error("[Config] pull response without expected code. retry times = {}, code = {}", retryTimes, response.getCode());
retryPolicy.fail();
retryTimes++;
retryPolicy.executeDelay();
} catch (Throwable t) {
LOGGER.error("[Config] failed to pull config file. retry times = {}", retryTimes, t);
retryPolicy.fail();
retryTimes++;
retryPolicy.executeDelay();
}
}
}
use of com.tencent.polaris.api.plugin.configuration.ConfigFileResponse in project polaris-java by polarismesh.
the class RemoteConfigFileRepoTest method testPullWithUnexpectedResponseCode.
@Test
public void testPullWithUnexpectedResponseCode() {
ConfigFileMetadata configFileMetadata = ConfigFileTestUtils.assembleDefaultConfigFileMeta();
ConfigFileResponse configFileResponse = new ConfigFileResponse(50000, "", null);
when(configFileConnector.getConfigFile(any())).thenReturn(configFileResponse);
RemoteConfigFileRepo remoteConfigFileRepo = new RemoteConfigFileRepo(sdkContext, configFileLongPollingService, configFileConnector, configFileMetadata);
// 重试三次
verify(configFileConnector, times(3)).getConfigFile(any());
verify(configFileLongPollingService).addConfigFile(remoteConfigFileRepo);
Assert.assertNull(remoteConfigFileRepo.getContent());
Assert.assertEquals(0, remoteConfigFileRepo.getConfigFileVersion());
}
use of com.tencent.polaris.api.plugin.configuration.ConfigFileResponse in project polaris-java by polarismesh.
the class RemoteConfigFileRepoTest method testNotifyAndPullSecondTime.
@Test
public void testNotifyAndPullSecondTime() throws InterruptedException {
ConfigFileMetadata configFileMetadata = ConfigFileTestUtils.assembleDefaultConfigFileMeta();
ConfigFile configFile = new ConfigFile(ConfigFileTestUtils.testNamespace, ConfigFileTestUtils.testGroup, ConfigFileTestUtils.testFileName);
String content = "hello world";
long version = 100;
configFile.setContent(content);
configFile.setVersion(version);
ConfigFileResponse configFileResponse = new ConfigFileResponse(ServerCodes.EXECUTE_SUCCESS, "", configFile);
when(configFileConnector.getConfigFile(any())).thenReturn(configFileResponse);
RemoteConfigFileRepo remoteConfigFileRepo = new RemoteConfigFileRepo(sdkContext, configFileLongPollingService, configFileConnector, configFileMetadata);
AtomicInteger cbCnt = new AtomicInteger();
// 增加两个listener
remoteConfigFileRepo.addChangeListener((configFileMetadata1, newContent) -> {
cbCnt.getAndIncrement();
});
remoteConfigFileRepo.addChangeListener((configFileMetadata1, newContent) -> {
cbCnt.getAndIncrement();
});
TimeUnit.MILLISECONDS.sleep(500);
// 第一次初始化拉取配置
verify(configFileConnector).getConfigFile(any());
verify(configFileLongPollingService).addConfigFile(remoteConfigFileRepo);
Assert.assertEquals(0, cbCnt.get());
Assert.assertEquals(content, remoteConfigFileRepo.getContent());
Assert.assertEquals(version, remoteConfigFileRepo.getConfigFileVersion());
// 变更通知,重新拉取配置
long newVersion = version + 1;
String newContent = "hello world2";
configFile.setContent(newContent);
configFile.setVersion(newVersion);
ConfigFileResponse configFileResponse2 = new ConfigFileResponse(ServerCodes.EXECUTE_SUCCESS, "", configFile);
when(configFileConnector.getConfigFile(any())).thenReturn(configFileResponse2);
remoteConfigFileRepo.onLongPollNotified(newVersion);
try {
TimeUnit.MILLISECONDS.sleep(500);
} catch (InterruptedException e) {
// ignore
}
verify(configFileConnector, times(2)).getConfigFile(any());
verify(configFileLongPollingService).addConfigFile(remoteConfigFileRepo);
// 触发回调
Assert.assertEquals(2, cbCnt.get());
Assert.assertEquals(newContent, remoteConfigFileRepo.getContent());
Assert.assertEquals(newVersion, remoteConfigFileRepo.getConfigFileVersion());
// 变更通知的版本号小于内存里缓存的版本号,则不会触发重新拉取配置
long smallVersion = 100;
remoteConfigFileRepo.onLongPollNotified(smallVersion);
try {
TimeUnit.MILLISECONDS.sleep(500);
} catch (InterruptedException e) {
// ignore
}
verify(configFileConnector, times(2)).getConfigFile(any());
verify(configFileLongPollingService).addConfigFile(remoteConfigFileRepo);
// 不触发回调,所以还是2次
Assert.assertEquals(2, cbCnt.get());
Assert.assertEquals(newContent, remoteConfigFileRepo.getContent());
Assert.assertEquals(newVersion, remoteConfigFileRepo.getConfigFileVersion());
}
use of com.tencent.polaris.api.plugin.configuration.ConfigFileResponse in project polaris-java by polarismesh.
the class RemoteConfigFileRepoTest method testPullSuccess.
@Test
public void testPullSuccess() {
ConfigFileMetadata configFileMetadata = ConfigFileTestUtils.assembleDefaultConfigFileMeta();
ConfigFile configFile = new ConfigFile(ConfigFileTestUtils.testNamespace, ConfigFileTestUtils.testGroup, ConfigFileTestUtils.testFileName);
String content = "hello world";
long version = 100;
configFile.setContent(content);
configFile.setVersion(version);
ConfigFileResponse configFileResponse = new ConfigFileResponse(ServerCodes.EXECUTE_SUCCESS, "", configFile);
when(configFileConnector.getConfigFile(any())).thenReturn(configFileResponse);
RemoteConfigFileRepo remoteConfigFileRepo = new RemoteConfigFileRepo(sdkContext, configFileLongPollingService, configFileConnector, configFileMetadata);
verify(configFileConnector).getConfigFile(any());
verify(configFileLongPollingService).addConfigFile(remoteConfigFileRepo);
Assert.assertEquals(content, remoteConfigFileRepo.getContent());
Assert.assertEquals(version, remoteConfigFileRepo.getConfigFileVersion());
}
Aggregations