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

CompletableFuture处理超时

在当前的 BatchProcessingService 类中,所有异步任务均通过 CompletableFuture.supplyAsync() 提交,并使用了自定义的 taskExecutor 执行器。但目前 没有实现超时控制,即如果某个任务长时间不完成,也不会中断或返回超时结果。

public void processWithTimeout(BatchRequest request,Consumer<ProcessResult> callback,CompletableFuture<ProcessResult> completableFuture) {CompletableFuture<ProcessResult> future = CompletableFuture.supplyAsync(() -> businessService.dealBusiness(request), taskExecutor);// 超时 futureCompletableFuture<ProcessResult> timeoutFuture = CompletableFuture.supplyAsync(() -> {try {return future.get(5, TimeUnit.SECONDS); // 等待最多5秒} catch (TimeoutException e) {future.cancel(true); // 尝试取消原任务throw new CompletionException(new Exception("处理超时"));} catch (Exception e) {throw new CompletionException(e);}}, taskExecutor);timeoutFuture.whenComplete((result, throwable) -> {if (throwable != null) {ProcessResult errorResult = new ProcessResult(request.getId(),false,"处理失败: " + throwable.getMessage(),null,0,(Exception) throwable.getCause());callback.accept(errorResult);completableFuture.completeExceptionally(throwable);} else {callback.accept(result);completableFuture.complete(result);}});}
  • 手动 get(timeout) 控制增加超时处理

输入API的请求参数如下:

[{"id":"1"
},
{"id":"2"
},
{"id":"3"
},
{"id":"999"
}]
  • id为999的数据为超时处理
  • 模拟超时的业务代码如下所示:
// 模拟处理逻辑String id = request.getId();Integer idInt = Integer.valueOf(id) == null ? 0 : Integer.valueOf(id);// 模拟超时:当ID为特定值时,延迟较长时间if (StringUtils.isNoneBlank(id) && idInt == 999) { // 假设999表示需要超时测试try {Thread.sleep(10000); // 模拟10秒超时} catch (InterruptedException e) {Thread.currentThread().interrupt();return new ProcessResult(request.getId(),false,"处理被中断",null,-1,e);}}

2026-01-18-194839

完整代码见上一篇博文

http://www.jsqmd.com/news/263783/

相关文章:

  • Python+django的农贸市场摊位商户管理信息系统设计与实现
  • 【时频分析】面向相交群延迟多分量信号的时频重分配同步挤压频域线性调频小波变换【含Matlab源码 14985期】复现含文献
  • 【数字信号调制】AWGN信道BPSK和QPSK仿真(含BER分析)【含Matlab源码 14987期】含报告
  • AI领域技术进展速览:从模型更新到硬件竞争
  • 【水果分类】计算机视觉和前馈神经网络自动水果分类系统【含Matlab源码 14978期】
  • 寒假学习笔记1.15
  • 机器学习优化投资组合压力测试
  • AI架构师进阶:模型评估的5大核心方法
  • 一款自动化的403/401绕过测试工具
  • 基于Comsol软件的激光熔覆熔池流动数值模拟:考虑马兰戈尼对流及元素影响下表面张力系数的转变研究
  • 英语_阅读_Baidus robotaxi_待读
  • XSS 漏洞练习靶场,覆盖反射型、存储型、DOM 型、SVG、CSP、框架注入、协议绕过等多种场景
  • 费雪的行业领导者理论:寻找市场冠军
  • IP反查工具,能够快速查询指定IP/域名关联的所有网站
  • 详细介绍:【杂谈】-边缘计算竞赛:人工智能硬件缘何超越云端
  • 学长亲荐10个AI论文写作软件,MBA论文轻松搞定!
  • java求职学习day49
  • ubuntu 实现远程登录
  • 挖掘 0-Day 漏洞:AFL++ 模糊测试实战,给开源图像库 (libpng) 找一个致命 Crash
  • 布隆过滤器进阶:布谷鸟过滤器 (Cuckoo Filter) 是如何支持“删除”操作的?
  • Codeforces Round 1073 Div1 + Div2 部分题目题解
  • web入门111-120
  • 第 485 场周赛Q1——3813. 元音辅音得分
  • 恶意代码分析:在沙箱中运行勒索病毒,用 IDA Pro 逆向它的加密逻辑
  • 导师严选2026 AI论文网站TOP8:继续教育写作全攻略
  • LLM 推理加速:深入 vLLM 源码,揭秘 PagedAttention 如何让吞吐量提升 20 倍?
  • 完整教程:【Go/Python/Java】基础语法+核心特性对比
  • 数据交易中的数据质量评估方法
  • 数据结构3.0 栈、队列和数组
  • 算子优化实战:手写 Triton Kernel,将 LayerNorm 算子的执行时间压缩 50%