Fix the bug that legacy API matchers in ScGatewayApiMatcherManager were not removed (#2436)

* Fix the bug that legacy API matchers in SC gateway adapter GatewayApiMatcherManager were not removed after the API group has been removed
This commit is contained in:
suyh 2021-11-29 20:24:24 +08:00 committed by Eric Zhao
parent 3e9f42efce
commit 051d583fd8
1 changed files with 9 additions and 12 deletions

View File

@ -15,23 +15,23 @@
*/
package com.alibaba.csp.sentinel.adapter.gateway.sc.api;
import com.alibaba.csp.sentinel.adapter.gateway.common.api.ApiDefinition;
import com.alibaba.csp.sentinel.adapter.gateway.sc.api.matcher.WebExchangeApiMatcher;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
import com.alibaba.csp.sentinel.adapter.gateway.common.api.ApiDefinition;
import com.alibaba.csp.sentinel.adapter.gateway.sc.api.matcher.WebExchangeApiMatcher;
/**
* @author Eric Zhao
* @since 1.6.0
*/
public final class GatewayApiMatcherManager {
private static final Map<String, WebExchangeApiMatcher> API_MATCHER_MAP = new ConcurrentHashMap<>();
private static volatile Map<String, WebExchangeApiMatcher> API_MATCHER_MAP = new HashMap<>();
public static Map<String, WebExchangeApiMatcher> getApiMatcherMap() {
return Collections.unmodifiableMap(API_MATCHER_MAP);
@ -50,15 +50,12 @@ public final class GatewayApiMatcherManager {
}
static synchronized void loadApiDefinitions(/*@Valid*/ Set<ApiDefinition> definitions) {
if (definitions == null || definitions.isEmpty()) {
API_MATCHER_MAP.clear();
return;
Map<String, WebExchangeApiMatcher> apiMatcherMap = new HashMap<>();
for (ApiDefinition definition : definitions) {
apiMatcherMap.put(definition.getApiName(), new WebExchangeApiMatcher(definition));
}
definitions.forEach(GatewayApiMatcherManager::addApiDefinition);
}
static void addApiDefinition(ApiDefinition definition) {
API_MATCHER_MAP.put(definition.getApiName(), new WebExchangeApiMatcher(definition));
API_MATCHER_MAP = apiMatcherMap;
}
private GatewayApiMatcherManager() {}