极端情况监听线程池变更请求会重复请求. (#47)

pull/84/head
chen.ma 4 years ago
parent 617b10ce73
commit b5d72c77e5

@ -62,6 +62,8 @@ public class Constants {
public static final String LISTENING_CONFIGS = "Listening-Configs"; public static final String LISTENING_CONFIGS = "Listening-Configs";
public static final String WEIGHT_CONFIGS = "Weight-Configs";
public static final String GROUP_KEY_DELIMITER = "+"; public static final String GROUP_KEY_DELIMITER = "+";
public static final String GROUP_KEY_DELIMITER_TRANSLATION = "\\+"; public static final String GROUP_KEY_DELIMITER_TRANSLATION = "\\+";

@ -1,12 +1,17 @@
package cn.hippo4j.config.service; package cn.hippo4j.config.service;
import org.springframework.beans.factory.annotation.Autowired; import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.util.Map; import java.util.Map;
import static cn.hippo4j.common.constant.Constants.WEIGHT_CONFIGS;
/** /**
* Config servlet inner. * Config servlet inner.
* *
@ -14,17 +19,52 @@ import java.util.Map;
* @date 2021/6/22 23:13 * @date 2021/6/22 23:13
*/ */
@Service @Service
@RequiredArgsConstructor
public class ConfigServletInner { public class ConfigServletInner {
@Autowired @NonNull
private LongPollingService longPollingService; private final LongPollingService longPollingService;
private final Cache<String, Long> deWeightCache = CacheBuilder.newBuilder()
.maximumSize(1024)
.build();
/**
* .
*
* @param request
* @param response
* @param clientMd5Map
* @param probeRequestSize
* @return
*/
public String doPollingConfig(HttpServletRequest request, HttpServletResponse response, Map<String, String> clientMd5Map, int probeRequestSize) { public String doPollingConfig(HttpServletRequest request, HttpServletResponse response, Map<String, String> clientMd5Map, int probeRequestSize) {
if (LongPollingService.isSupportLongPolling(request)) { if (LongPollingService.isSupportLongPolling(request) && weightVerification(request)) {
longPollingService.addLongPollingClient(request, response, clientMd5Map, probeRequestSize); longPollingService.addLongPollingClient(request, response, clientMd5Map, probeRequestSize);
return HttpServletResponse.SC_OK + ""; return HttpServletResponse.SC_OK + "";
} }
return HttpServletResponse.SC_OK + ""; return HttpServletResponse.SC_OK + "";
} }
/**
* .
* <p>
* 使, .
* . , .
*
* @param request
* @return
*/
private boolean weightVerification(HttpServletRequest request) {
String clientIdentify = request.getParameter(WEIGHT_CONFIGS);
Long timeVal = deWeightCache.getIfPresent(clientIdentify);
if (timeVal == null) {
deWeightCache.put(clientIdentify, System.currentTimeMillis());
return true;
}
return false;
}
} }

@ -8,6 +8,7 @@ import cn.hippo4j.common.web.base.Result;
import cn.hippo4j.starter.remote.HttpAgent; import cn.hippo4j.starter.remote.HttpAgent;
import cn.hippo4j.starter.remote.ServerHealthCheck; import cn.hippo4j.starter.remote.ServerHealthCheck;
import cn.hippo4j.starter.toolkit.thread.ThreadFactoryBuilder; import cn.hippo4j.starter.toolkit.thread.ThreadFactoryBuilder;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import lombok.SneakyThrows; import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -155,6 +156,7 @@ public class ClientWorker {
public List<String> checkUpdateTpIds(String probeUpdateString, boolean isInitializingCacheList) { public List<String> checkUpdateTpIds(String probeUpdateString, boolean isInitializingCacheList) {
Map<String, String> params = new HashMap(2); Map<String, String> params = new HashMap(2);
params.put(PROBE_MODIFY_REQUEST, probeUpdateString); params.put(PROBE_MODIFY_REQUEST, probeUpdateString);
params.put(WEIGHT_CONFIGS, IdUtil.simpleUUID());
Map<String, String> headers = new HashMap(2); Map<String, String> headers = new HashMap(2);
headers.put(LONG_PULLING_TIMEOUT, "" + timeout); headers.put(LONG_PULLING_TIMEOUT, "" + timeout);

Loading…
Cancel
Save