Skip to content

Commit 717c15e

Browse files
kezhenxu94lixiaojiee
authored andcommitted
[Enhancement]: refactor categorizing with Collectors.groupingBy (#3490)
1 parent 7c236ca commit 717c15e

File tree

1 file changed

+28
-19
lines changed

1 file changed

+28
-19
lines changed

dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryDirectory.java

Lines changed: 28 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
import java.util.HashSet;
5353
import java.util.List;
5454
import java.util.Map;
55+
import java.util.Objects;
5556
import java.util.Optional;
5657
import java.util.Set;
5758
import java.util.stream.Collectors;
@@ -64,7 +65,6 @@
6465
import static org.apache.dubbo.common.Constants.PROVIDERS_CATEGORY;
6566
import static org.apache.dubbo.common.Constants.ROUTERS_CATEGORY;
6667
import static org.apache.dubbo.common.Constants.ROUTE_PROTOCOL;
67-
import static org.apache.dubbo.common.utils.UrlUtils.classifyUrls;
6868

6969

7070
/**
@@ -124,7 +124,7 @@ public RegistryDirectory(Class<T> serviceType, URL url) {
124124
this.queryMap = StringUtils.parseQueryString(url.getParameterAndDecoded(Constants.REFER_KEY));
125125
this.overrideDirectoryUrl = this.directoryUrl = turnRegistryUrlToConsumerUrl(url);
126126
String group = directoryUrl.getParameter(Constants.GROUP_KEY, "");
127-
this.multiGroup = group != null && ("*".equals(group) || group.contains(","));
127+
this.multiGroup = group != null && (Constants.ANY_VALUE.equals(group) || group.contains(","));
128128
}
129129

130130
private URL turnRegistryUrlToConsumerUrl(URL url) {
@@ -189,21 +189,30 @@ public void destroy() {
189189

190190
@Override
191191
public synchronized void notify(List<URL> urls) {
192-
List<URL> categoryUrls = urls.stream()
192+
Map<String, List<URL>> categoryUrls = urls.stream()
193+
.filter(Objects::nonNull)
193194
.filter(this::isValidCategory)
194195
.filter(this::isNotCompatibleFor26x)
195-
.collect(Collectors.toList());
196+
.collect(Collectors.groupingBy(url -> {
197+
if (UrlUtils.isConfigurator(url)) {
198+
return CONFIGURATORS_CATEGORY;
199+
} else if (UrlUtils.isRoute(url)) {
200+
return ROUTERS_CATEGORY;
201+
} else if (UrlUtils.isProvider(url)) {
202+
return PROVIDERS_CATEGORY;
203+
}
204+
return "";
205+
}));
196206

197-
/**
198-
* TODO Try to refactor the processing of these three type of urls using Collectors.groupBy()?
199-
*/
200-
this.configurators = Configurator.toConfigurators(classifyUrls(categoryUrls, UrlUtils::isConfigurator))
201-
.orElse(configurators);
207+
List<URL> configuratorURLs = categoryUrls.getOrDefault(CONFIGURATORS_CATEGORY, Collections.emptyList());
208+
this.configurators = Configurator.toConfigurators(configuratorURLs).orElse(this.configurators);
202209

203-
toRouters(classifyUrls(categoryUrls, UrlUtils::isRoute)).ifPresent(this::addRouters);
210+
List<URL> routerURLs = categoryUrls.getOrDefault(ROUTERS_CATEGORY, Collections.emptyList());
211+
toRouters(routerURLs).ifPresent(this::addRouters);
204212

205213
// providers
206-
refreshOverrideAndInvoker(classifyUrls(categoryUrls, UrlUtils::isProvider));
214+
List<URL> providerURLs = categoryUrls.getOrDefault(PROVIDERS_CATEGORY, Collections.emptyList());
215+
refreshOverrideAndInvoker(providerURLs);
207216
}
208217

209218
private void refreshOverrideAndInvoker(List<URL> urls) {
@@ -283,7 +292,7 @@ private void refreshInvoker(List<URL> invokerUrls) {
283292

284293
private List<Invoker<T>> toMergeInvokerList(List<Invoker<T>> invokers) {
285294
List<Invoker<T>> mergedInvokers = new ArrayList<>();
286-
Map<String, List<Invoker<T>>> groupMap = new HashMap<String, List<Invoker<T>>>();
295+
Map<String, List<Invoker<T>>> groupMap = new HashMap<>();
287296
for (Invoker<T> invoker : invokers) {
288297
String group = invoker.getUrl().getParameter(Constants.GROUP_KEY, "");
289298
groupMap.computeIfAbsent(group, k -> new ArrayList<>());
@@ -343,11 +352,11 @@ private Optional<List<Router>> toRouters(List<URL> urls) {
343352
* @return invokers
344353
*/
345354
private Map<String, Invoker<T>> toInvokers(List<URL> urls) {
346-
Map<String, Invoker<T>> newUrlInvokerMap = new HashMap<String, Invoker<T>>();
355+
Map<String, Invoker<T>> newUrlInvokerMap = new HashMap<>();
347356
if (urls == null || urls.isEmpty()) {
348357
return newUrlInvokerMap;
349358
}
350-
Set<String> keys = new HashSet<String>();
359+
Set<String> keys = new HashSet<>();
351360
String queryProtocols = this.queryMap.get(Constants.PROTOCOL_KEY);
352361
for (URL providerUrl : urls) {
353362
// If protocol is configured at the reference side, only the matching protocol is selected
@@ -393,7 +402,7 @@ private Map<String, Invoker<T>> toInvokers(List<URL> urls) {
393402
enabled = url.getParameter(Constants.ENABLED_KEY, true);
394403
}
395404
if (enabled) {
396-
invoker = new InvokerDelegate<T>(protocol.refer(serviceType, url), url, providerUrl);
405+
invoker = new InvokerDelegate<>(protocol.refer(serviceType, url), url, providerUrl);
397406
}
398407
} catch (Throwable t) {
399408
logger.error("Failed to refer invoker for interface:" + serviceType + ",url:(" + url + ")" + t.getMessage(), t);
@@ -426,7 +435,7 @@ private URL mergeUrl(URL providerUrl) {
426435
this.overrideDirectoryUrl = this.overrideDirectoryUrl.addParametersIfAbsent(providerUrl.getParameters()); // Merge the provider side parameters
427436

428437
if ((providerUrl.getPath() == null || providerUrl.getPath()
429-
.length() == 0) && "dubbo".equals(providerUrl.getProtocol())) { // Compatible version 1.0
438+
.length() == 0) && Constants.DUBBO_PROTOCOL.equals(providerUrl.getProtocol())) { // Compatible version 1.0
430439
//fix by tony.chenl DUBBO-44
431440
String path = directoryUrl.getParameter(Constants.INTERFACE_KEY);
432441
if (path != null) {
@@ -474,7 +483,7 @@ private URL overrideWithConfigurators(List<Configurator> configurators, URL url)
474483
private void destroyAllInvokers() {
475484
Map<String, Invoker<T>> localUrlInvokerMap = this.urlInvokerMap; // local reference
476485
if (localUrlInvokerMap != null) {
477-
for (Invoker<T> invoker : new ArrayList<Invoker<T>>(localUrlInvokerMap.values())) {
486+
for (Invoker<T> invoker : new ArrayList<>(localUrlInvokerMap.values())) {
478487
try {
479488
invoker.destroy();
480489
} catch (Throwable t) {
@@ -505,7 +514,7 @@ private void destroyUnusedInvokers(Map<String, Invoker<T>> oldUrlInvokerMap, Map
505514
for (Map.Entry<String, Invoker<T>> entry : oldUrlInvokerMap.entrySet()) {
506515
if (!newInvokers.contains(entry.getValue())) {
507516
if (deleted == null) {
508-
deleted = new ArrayList<String>();
517+
deleted = new ArrayList<>();
509518
}
510519
deleted.add(entry.getKey());
511520
}
@@ -597,7 +606,7 @@ public boolean isAvailable() {
597606
}
598607
Map<String, Invoker<T>> localUrlInvokerMap = urlInvokerMap;
599608
if (localUrlInvokerMap != null && localUrlInvokerMap.size() > 0) {
600-
for (Invoker<T> invoker : new ArrayList<Invoker<T>>(localUrlInvokerMap.values())) {
609+
for (Invoker<T> invoker : new ArrayList<>(localUrlInvokerMap.values())) {
601610
if (invoker.isAvailable()) {
602611
return true;
603612
}

0 commit comments

Comments
 (0)