我正在使用 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
? 这种情况只发生在一些电话中。这些请求永远被卡住了。
暂无答案!
目前还没有任何答案,快来回答吧!