redisson信号量到期不被接受

vvppvyoh  于 2021-06-09  发布在  Redis
关注(0)|答案(0)|浏览(268)

我正在使用 Redisson 同步我们的API。这是你的名字 Aspect 我正在使用:

@Aspect
@Component
@Slf4j
public class SerialiseRequestsOnDistributedMutexAspect {

  private final String lockOn = "LockOn";

  @Autowired(required = false)
  RedissonClient client;

  @Around("@annotation(somepath)")
  @SuppressWarnings("unchecked")
  public DeferredResult<ResponseEntity<?>> controllerProxy(ProceedingJoinPoint pjp)
      throws Throwable {

    try {

      Long startTime = System.currentTimeMillis();

      //extract parameters from the request
      Map<String, String> parameters = getParameters(pjp);

      //the semaphore key
      String lockOn = parameters.get(this.lockOn);

      RPermitExpirableSemaphore semaphore = client.getPermitExpirableSemaphore(lockOn);

      semaphore.trySetPermits(1);

      DeferredResult<ResponseEntity<?>> dr;

      MDC.clear();

      String permitId = getPermit(semaphore);

      if (null != permitId) {

        semaphore.updateLeaseTime(
            permitId, 60_000l, TimeUnit.MILLISECONDS);
        semaphore.expire(60_000l, TimeUnit.MILLISECONDS);

        try {
          Object result = pjp.proceed();
          dr = (DeferredResult<ResponseEntity<?>>) result;
          addCallbacksOnDeferredResult(dr, semaphore);
        } catch (Exception e) {
          semaphore.release(permitId);
          throw e;
        }
      } else {
        throw new RuntimeException("Similar request in progress");
      }
      return dr;
    } catch (Exception e) {
      throw e;
    }
  }

  private String getPermit(RPermitExpirableSemaphore semaphore) {
    return semaphore.tryAcquire();
  }

  private void addCallbacksOnDeferredResult(
      DeferredResult<ResponseEntity<?>> dr,
      RPermitExpirableSemaphore lock) {
    dr.onCompletion(
        () -> {
          MDC.clear();
          lock.release(requestMetadata.permitId());
        });
    dr.onTimeout(
        () -> {
          MDC.clear();
          lock.release(requestMetadata.permitId());
        });
    dr.onError(
        (err) -> {
          MDC.clear();
          lock.release(requestMetadata.permitId());
        });
  }

}

我观察到一些案例 LockOn redis中的对象具有 TTL 设置为-1。这意味着没有 TTL . 但我很清楚地把它设定为 60s 一次成功的收购。是我做错了什么还是这是一个错误 Redisson ? 这种情况只发生在一些电话中。这些请求永远被卡住了。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题