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

dubbo 异步化实践

@DubboService
public class AsyncOrderFacadeImpl implements AsyncOrderFacade {private Logger logger = LoggerFactory.getLogger(AsyncOrderFacadeImpl.class);// 构建线程池ThreadPoolExecutor threadPoolExecutor= new ThreadPoolExecutor(1000, 1000, 10, TimeUnit.SECONDS, new ArrayBlockingQueue<>(1024));@Overridepublic OrderInfo queryOrderById(String id) {// 开启异步化操作模式,标识异步化模式开启AsyncContext asyncContext = RpcContext.startAsync();threadPoolExecutor.submit(() -> {// 同步queryOrderById方法所在的线程上下文信息到当前的子线程中asyncContext.signalContextSwitch();try {TimeUnit.MILLISECONDS.sleep(50);} catch (InterruptedException e) {throw new RuntimeException(e);}// 使用asyncContext将结果返回asyncContext.write(new OrderInfo("GeekDubbo", "服务方异步方式之RpcContext.startAsync#" + id, new BigDecimal(2000)));logger.info("-------------- end --------------");});return null;}
}

org.apache.dubbo.rpc.RpcContext#startAsync

public static AsyncContext startAsync() throws IllegalStateException {// 获取上下文对象RpcContext currentContext = getContext();// AsyncContext 是Dubbo服务提供者端实现的异步处理的核心接口,用于将同步调用转为异步执行if (currentContext.asyncContext == null) {// 获取Dubbo上下文currentContext.asyncContext = new AsyncContextImpl();}// 创建CompletableFuture实例currentContext.asyncContext.start();return currentContext.asyncContext;
}

org.apache.dubbo.rpc.AsyncContextImpl

/*** 初始化上下文实例*/
public AsyncContextImpl() {// 获取当前线程绑定的RpcContext实例,包含请求和响应双向信息// 跨服务参数透传:消费端设置隐式参数,提供端通过getAttachment获取// 异步调用管理:通过getCompletableFuture()处理异步结果(消费端)或延迟写入响应(提供端)this.storedContext = RpcContext.getContext();// 获取服务端特有的响应上下文,用于回传数据(dubbo3.x中废弃,使用getServiceContext())]// 服务端响应附件元数据:服务端处理完成后,通过setAttachment回传签名,加密令牌等数据this.storedServerContext = RpcContext.getServerContext();
}

org.apache.dubbo.rpc.AsyncContextImpl#start

public void start() {if (this.started.compareAndSet(false, true)) {// 创建CompletableFuture实例// 该对象用于非阻塞式任务编排,支持链式调用和组合操作,简化多线程开发复杂度this.future = new CompletableFuture<>();}
}

org.apache.dubbo.rpc.AsyncContextImpl#signalContextSwitch

/*** 将主线程中的上下文对象同步到当前线程上下文中*/
@Override
public void signalContextSwitch() {RpcContext.restoreContext(storedContext);RpcContext.restoreServerContext(storedServerContext);// Restore any other contexts in here if necessary.
}

org.apache.dubbo.rpc.AsyncContextImpl#write

 @Overridepublic void write(Object value) {if (isAsyncStarted() && stop()) {if (value instanceof Throwable) {Throwable bizExe = (Throwable) value;future.completeExceptionally(bizExe);} else {// 将结果写回future.complete(value);}} else {throw new IllegalStateException("The async response has probably been wrote back by another thread, or the asyncContext has been closed.");}}
http://www.xdnf.cn/news/165439.html

相关文章:

  • 【MFA】✈️集成谷歌TOTP实现MFA多因素认证
  • 数组的多种声明方式:类型标注与泛型数组
  • 做大模型应用所需的一点点基础数学理论
  • 扩展和自定义 asammdf 库:满足特定需求的解决方案
  • 文章记单词 | 第46篇(六级)
  • 深度学习中的预训练与微调:从基础概念到实战应用全解析
  • Threejs中顶视图截图
  • javase和java有什么区别
  • spring响应式编程系列:异步生产数据
  • 第八课四则运算 设计运算器
  • 三维重建(二十)——思路整理与第一步的进行
  • 2025上海车展| 和芯星通发布覆盖车载全场景的产品方案
  • [Windows] 易剪媒 v0.0.8 绿色版 —— 跨平台AI批量自动剪辑视频工具
  • 罗技Flow跨电脑控制
  • 三菱PLC软元件 定时器 计数器 状态继电器 编码器
  • Volcano 进阶实战 (二) - (网络拓扑/负载感知)调度
  • 深入解析Dify中的文本清洗处理器:CleanProcessor详解
  • 玩转Pygame绘图:从简单图形到炫酷精灵
  • 构造函数有哪些种类?
  • 敦普水性低温烤漆:金属涂装80℃烘烤的防护体系
  • 牛客:BM1 反转链表
  • 利用 functools.lru_cache 优化递归算法
  • GPU 加速库(CUDA/cuDNN)
  • 每日面试实录·滴滴·校招·JAVA
  • MIL、SIL、HIL与Back-to-Back测试详解:从模型到硬件的完整验证链
  • ultralytics 目标检测 混淆矩阵 背景图像 没被记录
  • docker 常用配置
  • 信息系统项目管理工程师备考计算类真题讲解十
  • 数位 DP 详解
  • Python并行计算:2.Python多线程编程:threading模块详解与守护线程实战