in dubbo-xds/src/main/java/org/apache/dubbo/rpc/cluster/router/xds/XdsRouter.java [227:263]
public void notify(BitList<Invoker<T>> invokers) {
BitList<Invoker<T>> invokerList = invokers == null ? BitList.emptyList() : invokers;
currentInvokeList = invokerList.clone();
// compute need subscribe/unsubscribe rds application
Set<String> currentApplications = new HashSet<>();
for (Invoker<T> invoker : invokerList) {
String applicationName = invoker.getUrl().getRemoteApplication();
if (StringUtils.isNotEmpty(applicationName)) {
currentApplications.add(applicationName);
}
}
if (!subscribeApplications.equals(currentApplications)) {
synchronized (this) {
for (String currentApplication : currentApplications) {
if (!subscribeApplications.contains(currentApplication)) {
rdsRouteRuleManager.subscribeRds(currentApplication, this);
}
}
for (String preApplication : subscribeApplications) {
if (!currentApplications.contains(preApplication)) {
rdsRouteRuleManager.unSubscribeRds(preApplication, this);
}
}
subscribeApplications = currentApplications;
}
}
// update subset
synchronized (this) {
BitList<Invoker<T>> allInvokers = currentInvokeList.clone();
for (DestinationSubset<T> subset : destinationSubsetMap.values()) {
computeSubset(subset, allInvokers);
}
}
}