调用springboot接口时,如何实现覆盖上一次调用
Spring Boot 接口覆盖上一次调用的实现方案
以下是多种实现覆盖上一次接口调用的方案,适用于不同场景。
方案一:同步锁控制(单机环境)
适用场景:单实例服务,需要同步阻塞式处理请求。
private final Object lock = new Object();
private String latestRequestId;
@PostMapping("/process")
public ResponseEntity<?> processRequest(@RequestBody Request request) {
synchronized (lock) {
latestRequestId = request.getRequestId();
// 处理业务逻辑...
return ResponseEntity.ok("Processed: " + latestRequestId);
}
}
方案二:异步任务取消
适用场景:需终止未完成的异步任务时使用。
private Future<?> currentTask;
@PostMapping("/async-process")
public ResponseEntity<?> asyncProcess() {
// 取消之前的任务
if (currentTask != null && !currentTask.isDone()) {
currentTask.cancel(true);
}
// 提交新任务
currentTask = CompletableFuture.runAsync(() -> {
// 模拟耗时操作
try {
Thread.sleep(5000);
System.out.println("Task completed");
} catch (InterruptedException e) {
System.out.println("Task cancelled");
}
});
return ResponseEntity.ok("New task started");
}
方案三:版本号控制
适用场景:客户端可携带版本号的请求场景。
private AtomicInteger latestVersion = new AtomicInteger(0);
@PostMapping("/versioned-process")
public ResponseEntity<?> versionedProcess(@RequestParam int clientVersion) {
// 拒绝旧版本请求
if (clientVersion < latestVersion.get()) {
return ResponseEntity.status(409).body("Stale request");
}
// 更新为最新版本并处理
latestVersion.set(clientVersion);
// 业务逻辑...
return ResponseEntity.ok("Processed version: " + clientVersion);
}
方案四:分布式锁(集群环境)
适用场景:多实例微服务集群环境。
@Autowired
private RedissonClient redisson;
@PostMapping("/distributed-process")
public ResponseEntity<?> distributedProcess(@RequestBody Request request) {
RLock lock = redisson.getLock("PROCESS_LOCK");
try {
if (lock.tryLock(0, 10, TimeUnit.SECONDS)) {
// 处理核心逻辑...
return ResponseEntity.ok("Processed exclusively");
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
} finally {
lock.unlock();
}
return ResponseEntity.status(429).body("Request rejected due to concurrent operation");
}
方案五:队列缓冲最新请求
适用场景:高频请求场景,仅需处理最新状态。
private BlockingQueue<Request> requestQueue = new LinkedBlockingQueue<>(1);
@PostMapping("/queue-process")
public ResponseEntity<?> queueProcess(@RequestBody Request request) {
// 清空队列并放入新请求
requestQueue.clear();
requestQueue.offer(request);
return ResponseEntity.ok("Request queued");
}
@PostConstruct
public void initProcessor() {
new Thread(() -> {
while (true) {
try {
Request request = requestQueue.take();
process(request); // 处理实际业务
} catch (InterruptedException e) {
break;
}
}
}).start();
}
方案选择建议
场景需求 推荐方案
单机简单同步逻辑 同步锁控制
异步长任务中断 异步任务取消
客户端支持版本控制 版本号控制
微服务集群环境 分布式锁
高频请求保留最新状态 队列缓冲
注意事项:
- 线程安全:在共享资源操作时需保证原子性
- 分布式一致性:集群环境下建议使用 Redis 或 ZooKeeper
- 异常处理:需妥善处理任务中断和锁释放问题