博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Dubbo并发通信原理解析
阅读量:5925 次
发布时间:2019-06-19

本文共 756 字,大约阅读时间需要 2 分钟。

hot3.png

1.消费者一个线程调用远程接口,生成一个唯一的ID(比如一段随机字符串,UUID等),Dubbo是使用AtomicLong从0开始累计数字的。

2.将方法调用信息(如调用的接口名称,方法名称,参数值列表等)和处理结果的回调对象callback(即ResponseFuture对象),全部封装在一起组成一个对象object。向专门存放调用信息的全局ConcurrentHashMap里面put(ID, object)。
3.将ID和打包的方法调用信息封装成一对象connRequest,通过Netty异步发送出去。
4.当前线程再使用callback的get()方法试图获取远程返回的结果,在get()内部,则使用lock.lock()获取回调对象callback的锁, 再先检测是否已经获取到结果,如果没有,然后调用callback的wait()方法,释放callback上的锁,让当前线程处于等待状态。
5.服务端接收到请求并处理后,将结果(此结果中包含了前面的ID,即回传)发送给客户端,客户端socket连接上专门监听消息的线程收到消息,分析结果,取到ID,再从前面的ConcurrentHashMap里面get(ID),从而找到callback,将方法调用结果设置到callback对象里。
6.监听线程接着使用lock.lock()获取回调对象callback的锁,再调用signal()(类似notifyAll())方法唤醒前面处于等待状态的线程继续执行。至此,整个过程结束。

附源码:https://blog.csdn.net/u010942020/article/details/79263854

转载于:https://my.oschina.net/u/3705388/blog/3015274

你可能感兴趣的文章
linux中的压缩命令详细解析(二)
查看>>
我的友情链接
查看>>
nagios自定义脚本直接执行的结果与nrpe执行的结果不同的问题
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
VBScript基于WSH编程
查看>>
doker入门实践之容器管理 (一)
查看>>
下一代云计算:低熵云 | 演讲实录
查看>>
TypeScript入门教程
查看>>
angular分页组件
查看>>
更新知识库:WinHttpConnect 并不 TCP Connect 和 Punycode
查看>>
Velocity-把例子贴在src目录下Example 运行找不到文件
查看>>
[MyBatis]深入浅出Mybatis系列(一)---Mybatis入门
查看>>
利用nginx/apache代理wss 实现 小程序 端口 反向代理
查看>>
有关eclipse内核软件的插件
查看>>
关于工作流
查看>>
Win10系统键盘鼠标工作中失灵
查看>>
钢琴五线谱 学习分享(兴趣爱好)
查看>>
Schemaless架构(二):Uber基于MySQL的Trip数据库
查看>>
开了香槟的Kubernetes并不打算放慢成功的脚步
查看>>