in shenyu-sync-data-center/shenyu-sync-data-http/src/main/java/org/apache/shenyu/sync/data/http/HttpSyncDataService.java [189:239]
private void doLongPolling(final String server) {
MultiValueMap<String, String> params = new LinkedMultiValueMap<>(8);
for (ConfigGroupEnum group : ConfigGroupEnum.values()) {
ConfigData<?> cacheConfig = factory.cacheConfigData(group);
if (Objects.nonNull(cacheConfig)) {
String value = String.join(",", cacheConfig.getMd5(), String.valueOf(cacheConfig.getLastModifyTime()));
params.put(group.name(), Lists.newArrayList(value));
}
}
params.put("namespaceId", Lists.newArrayList(shenyuConfig.getNamespace()));
LOG.debug("listener params: [{}]", params);
Headers headers = new Headers.Builder()
.add(Constants.X_ACCESS_TOKEN, this.accessTokenManager.getAccessToken())
.add("Content-Type", "application/x-www-form-urlencoded")
.build();
String listenerUrl = server + Constants.SHENYU_ADMIN_PATH_CONFIGS_LISTENER;
String uri = UriComponentsBuilder.fromHttpUrl(listenerUrl).queryParams(params).build(true).toUriString();
Request request = new Request.Builder()
.url(uri)
.headers(headers)
.post(RequestBody.create("", null))
.build();
JsonArray groupJson;
try (Response response = okHttpClient.newCall(request).execute()) {
if (!response.isSuccessful()) {
String message = String.format("listener configs fail, server:[%s], http status code[%s]", server, response.code());
throw new ShenyuException(message);
}
ResponseBody responseBody = response.body();
Assert.notNull(responseBody, "Resolve response body failed.");
String json = responseBody.string();
LOG.info("listener result: [{}]", json);
JsonObject responseFromServer = GsonUtils.getGson().fromJson(json, JsonObject.class);
JsonElement element = responseFromServer.get("data");
if (element.isJsonNull()) {
return;
}
groupJson = responseFromServer.getAsJsonArray("data");
} catch (IOException e) {
String message = String.format("listener configs fail, server:[%s], %s", server, e.getMessage());
throw new ShenyuException(message, e);
}
if (Objects.nonNull(groupJson) && !groupJson.isEmpty()) {
// fetch group configuration async.
ConfigGroupEnum[] changedGroups = GsonUtils.getGson().fromJson(groupJson, ConfigGroupEnum[].class);
LOG.info("Group config changed: {}", Arrays.toString(changedGroups));
this.doFetchGroupConfig(server, changedGroups);
}
}