当前位置: 首页 > news >正文

情况:后端涉及到异步操作,数据还没更新完就直接向前端返回success的结果。

情况:后端涉及到异步操作,那么可能数据还没更新完就直接向前端返回success的结果。这就导致数据不一致。因此需要采用锁或者其他机制,对异步场景进行处理,确保数据的一致性。

下面是一些常用的方法,简单情况直接用CountDownLatch计数器锁即可实现,下面还有多种方法,包括回调,消息队列等。

下面有代码的示例,大家可以根据需要,自行查看!

1. CountDownLatch(计数器锁)

适用于简单的多线程同步场景,等待一个或多个线程完成操作后再继续执行。

@PostMapping("syncData")
public AjaxJson syncData() {CountDownLatch latch = new CountDownLatch(1); // 初始化计数器为1// 异步操作asyncService.processData(latch);try {// 等待最多5秒if (!latch.await(5, TimeUnit.SECONDS)) {return AjaxJson.getError("操作超时");}} catch (InterruptedException e) {Thread.currentThread().interrupt();return AjaxJson.getError("操作被中断");}return AjaxJson.getSuccess();
}
​
// 异步服务中
public void processData(CountDownLatch latch) {try {// 执行异步操作...} finally {latch.countDown(); // 操作完成,计数器减1}
}

2. CompletableFuture(Java 8+)

更现代的异步编程方式,支持链式调用和组合多个异步操作。

@PostMapping("syncData")
public CompletableFuture<AjaxJson> syncData() {return CompletableFuture.supplyAsync(() -> {// 异步操作return processData();}).thenApply(result -> {return AjaxJson.getSuccessData(result);}).exceptionally(ex -> {return AjaxJson.getError("操作失败: " + ex.getMessage());}).completeOnTimeout(AjaxJson.getError("操作超时"), 5, TimeUnit.SECONDS);
}
​
private SomeResult processData() {// 执行耗时操作...return someResult;
}

3. 回调机制

适用于事件驱动的架构,通过回调函数处理异步结果。

@PostMapping("syncData")
public AjaxJson syncData() {CompletableFuture<Boolean> future = new CompletableFuture<>();asyncService.processData(new AsyncCallback() {@Overridepublic void onSuccess() {future.complete(true);}@Overridepublic void onFailure(Exception e) {future.completeExceptionally(e);}});try {Boolean result = future.get(5, TimeUnit.SECONDS);return result ? AjaxJson.getSuccess() : AjaxJson.getError();} catch (Exception e) {return AjaxJson.getError(e.getMessage());}
}

4. 消息队列+数据库状态

适用于分布式系统,通过消息队列和数据库状态保证最终一致性。

@PostMapping("startSync")
public AjaxJson startSync() {String taskId = UUID.randomUUID().toString();// 初始化任务状态为"处理中"taskService.createTask(taskId, "PROCESSING");// 发送消息到队列messageQueue.send(new SyncMessage(taskId));return AjaxJson.getSuccessData(taskId);
}
​
@GetMapping("checkStatus/{taskId}")
public AjaxJson checkStatus(@PathVariable String taskId) {Task task = taskService.getTask(taskId);if ("COMPLETED".equals(task.getStatus())) {return AjaxJson.getSuccess();} else if ("FAILED".equals(task.getStatus())) {return AjaxJson.getError(task.getErrorMessage());}return AjaxJson.getError("处理中,请稍后再试");
}
​
// 消费者端
@RabbitListener(queues = "syncQueue")
public void processSyncMessage(SyncMessage message) {try {// 处理业务逻辑...taskService.updateTask(message.getTaskId(), "COMPLETED", null);} catch (Exception e) {taskService.updateTask(message.getTaskId(), "FAILED", e.getMessage());}
}

5. 响应式编程(WebFlux)

使用Spring WebFlux进行非阻塞式编程。

@PostMapping("/syncData")
public Mono<AjaxJson> syncData() {return Mono.fromCallable(() -> {// 模拟耗时操作Thread.sleep(2000);return "处理结果";}).timeout(Duration.ofSeconds(5)).map(result -> AjaxJson.getSuccessData(result)).onErrorResume(ex -> Mono.just(AjaxJson.getError(ex.getMessage())));
}

最佳实践建议

  1. 简单场景:使用CountDownLatch或CompletableFuture

  2. 复杂异步流程:使用CompletableFuture的组合操作

  3. 分布式系统:使用消息队列+数据库状态

  4. 高并发系统:考虑响应式编程(WebFlux)

  5. 超时处理:所有方案都应设置合理的超时时间

  6. 错误处理:确保异常情况能被妥善处理并反馈给客户端

http://www.dtcms.com/a/294764.html

相关文章:

  • 如何做好性能测试?
  • 自定义类型:结构体,联合和枚举
  • 慢 SQL接口性能优化实战
  • 线路板快板厂家有哪些?
  • HCIA复习+网络类型及数据链路层协议复习
  • 【已解决】ubuntu执行sudo apt update镜像源更新失败:404 Not Found 没有 Release 文件。
  • 2025暑期—04环境设置-D2L+Jupyter
  • Java应用程序内存占用分析
  • Android root和完整性检测实现方案深度分析
  • 第三章 浏览器 【1. 文档对象模型(DOM)】
  • Pandas库全面学习指南(一)
  • 视觉大模型
  • Linux基本命令
  • 【读代码】Facebook Denoiser:开源端到端语音降噪系统原理与实战
  • 主流软件开发方法综述:从敏捷到开源
  • 表征工程与置信度增强:表征工程是提取隐藏层状态表征,LLM的置信度增强是优化的logist数值
  • 第一章:Go语言基础入门之Hello World与Go程序结构
  • 基于vue框架的服装店管理系统tma7v(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • FastGPT + Kymo:解锁企业专属知识库与智能体开发新体验
  • M3066ANL网络变压器,常用于NEC方案机顶盒等网络设备M3066AN实现网络信号的稳定传输与电气隔离保护
  • MybatisPlus操作方法详细总结
  • ar景区导航导览开发方案:核心技术架构与功能设计
  • 阶段1--域名服务器
  • Ceph残留磁盘清理与格式化
  • lesson22:Python的魔法方法
  • irf实验
  • 常用的正则表达式
  • 陷波频率处的相位补偿:相角超前矫正原理深度拆解
  • 综合实验(2)
  • QGraphicsScene导出为PDF