import java.util.concurrent.ConcurrentHashMap;
public class RequestLimiter {
// 使用ConcurrentHashMap来存储请求的唯一标识符,保证线程安全
private static final ConcurrentHashMap<String, Boolean> requestMap = new ConcurrentHashMap<>();
/**
* 防止接口重复请求的方法
* @param requestId 请求的唯一标识符
* @return 如果是重复请求返回false,否则返回true
*/
public boolean preventDuplicateRequests(String requestId) {
// 尝试将requestId放入map中,如果已经存在则返回false
return requestMap.putIfAbsent(requestId, Boolean.TRUE) == null;
}
/**
* 移除请求标识符,以便后续可以再次请求
* @param requestId 请求的唯一标识符
*/
public void removeRequestId(String requestId) {
requestMap.remove(requestId);
}
public static void main(String[] args) {
RequestLimiter limiter = new RequestLimiter();
String requestId = "uniqueRequestId";
// 第一次请求
if (limiter.preventDuplicateRequests(requestId)) {
System.out.println("处理请求");
} else {
System.out.println("重复请求,不予处理");
}
// 模拟第二次重复请求
if (limiter.preventDuplicateRequests(requestId)) {
System.out.println("处理请求");
} else {
System.out.println("重复请求,不予处理");
}
// 移除请求标识符后可以再次请求
limiter.removeRequestId(requestId);
if (limiter.preventDuplicateRequests(requestId)) {
System.out.println("处理请求");
} else {
System.out.println("重复请求,不予处理");
}
}
}
ConcurrentHashMap来存储请求的唯一标识符(requestId),以确保线程安全。每个requestId对应一个布尔值Boolean.TRUE,表示该请求已经被处理过。requestId放入requestMap中,如果requestId已经存在,则返回false,表示这是一个重复请求;否则返回true,表示这是一个新的请求。requestId,使得相同的requestId可以在未来的某个时间点再次被接受。希望这段代码和解释对你有帮助!
下一篇:java枚举类型
Laravel PHP 深圳智简公司。版权所有©2023-2043 LaravelPHP 粤ICP备2021048745号-3
Laravel 中文站