|
|
@@ -26,7 +26,7 @@ import java.util.Map;
|
|
|
@Service
|
|
|
@Primary
|
|
|
public class ErpOrderServiceProxy implements IErpOrderService {
|
|
|
- private final RateLimiter rateLimiter = RateLimiter.create(5.0);
|
|
|
+ private final RateLimiter rateLimiter = RateLimiter.create(1.0);
|
|
|
|
|
|
/**
|
|
|
* 存储所有实现的ERP订单服务
|
|
|
@@ -76,41 +76,20 @@ public class ErpOrderServiceProxy implements IErpOrderService {
|
|
|
@Override
|
|
|
public ErpOrderQueryResponse getOrder(ErpOrderQueryRequert param) {
|
|
|
if(StringUtils.equals(ErpContextHolder.getErpType(), ErpTypeConstant.JST_ERP)) {
|
|
|
- // 最大重试次数
|
|
|
- int maxRetries = 3;
|
|
|
- // 当前重试次数
|
|
|
- int retryCount = 0;
|
|
|
-
|
|
|
- while (retryCount < maxRetries) {
|
|
|
- if (rateLimiter.tryAcquire()) {
|
|
|
- // 获取到令牌,直接执行请求
|
|
|
- return getCurrentErpService().getOrder(param);
|
|
|
- }
|
|
|
-
|
|
|
- // 重试计数增加
|
|
|
- retryCount++;
|
|
|
-
|
|
|
- if (retryCount < maxRetries) {
|
|
|
- try {
|
|
|
- // 每次重试间隔时间递增:500ms, 1000ms, 1500ms...
|
|
|
- long waitTime = 1000 * retryCount;
|
|
|
- Thread.sleep(waitTime);
|
|
|
- log.info("ERP请求被限流,等待{}ms后第{}次重试", waitTime, retryCount);
|
|
|
- } catch (InterruptedException e) {
|
|
|
- Thread.currentThread().interrupt();
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // 达到最大重试次数后仍无法获取令牌,才抛出异常
|
|
|
- throw new RuntimeException("请求过于频繁,请稍后再试");
|
|
|
+ // 阻塞等待直到获取到令牌
|
|
|
+ rateLimiter.acquire();
|
|
|
+ log.info("获取到令牌,执行ERP请求");
|
|
|
}
|
|
|
return getCurrentErpService().getOrder(param);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public ErpOrderQueryResponse getOrderLive(ErpOrderQueryRequert param) {
|
|
|
+ if(StringUtils.equals(ErpContextHolder.getErpType(), ErpTypeConstant.JST_ERP)) {
|
|
|
+ // 阻塞等待直到获取到令牌
|
|
|
+ rateLimiter.acquire();
|
|
|
+ log.info("获取到令牌,执行ERP请求");
|
|
|
+ }
|
|
|
return getCurrentErpService().getOrderLive(param);
|
|
|
}
|
|
|
|