dubbo的请求、响应对
dubbo中的请求和响应是如何关联起来的呢?
每一个请求和响应共用同一个id。
public class DefaultFuture implements ResponseFuture {
// invoke id.
private final long id;
private final Request request;
private volatile Response response;
}
consumer创建请求的调用栈:
public class Request {
private static final AtomicLong INVOKE_ID = new AtomicLong(0);
private final long mId; public Request() {
mId = newId();
} public long getId() {
return mId;
}
private static long newId() {
// getAndIncrement()增长到MAX_VALUE时,再增长会变为MIN_VALUE,负数也可以做为ID
return INVOKE_ID.getAndIncrement();
}
}
provider 创建响应:
//HeaderExchangeHandler类
Response handleRequest(ExchangeChannel channel, Request req) throws RemotingException {
//使用请求的id,作为响应的id
Response res = new Response(req.getId(), req.getVersion());
if (req.isBroken()) {
Object data = req.getData(); String msg;
if (data == null) msg = null;
else if (data instanceof Throwable) msg = StringUtils.toString((Throwable) data);
else msg = data.toString();
res.setErrorMessage("Fail to decode request due to: " + msg);
res.setStatus(Response.BAD_REQUEST); return res;
}
// find handler by message class.
Object msg = req.getData();
try {
// handle data.
Object result = handler.reply(channel, msg);
res.setStatus(Response.OK);
res.setResult(result);
} catch (Throwable e) {
res.setStatus(Response.SERVICE_ERROR);
res.setErrorMessage(StringUtils.toString(e));
}
return res;
}
dubbo的响应:
//省略其他代码
public class Response {
public static final String HEARTBEAT_EVENT = null;
public static final String READONLY_EVENT = "R";
public static final byte OK = 20;
public static final byte CLIENT_TIMEOUT = 30;
public static final byte SERVER_TIMEOUT = 31;
public static final byte BAD_REQUEST = 40;
public static final byte BAD_RESPONSE = 50;
public static final byte SERVICE_NOT_FOUND = 60;
public static final byte SERVICE_ERROR = 70;
public static final byte SERVER_ERROR = 80;
public static final byte CLIENT_ERROR = 90;
private long mId = 0;
private String mVersion;
//响应的状态
private byte mStatus = OK;
private boolean mEvent = false;
private String mErrorMsg;
// 真实类型是 RpcResult,存放provider返回的结果值或异常
private Object mResult;
} public class RpcResult implements Result, Serializable {
private static final long serialVersionUID = -6925924956850004727L;
//存放返回值。如果接口声明为void,则result为null
private Object result;
//异常
private Throwable exception;
public RpcResult(){ }
}
请求-响应对示例:
dubbo的请求、响应对的更多相关文章
- 你想建设一个能承受500万PV/每天的网站吗?服务器每秒要处理多少个请求才能应对?
你想建设一个能承受500万PV/每天的网站吗?服务器每秒要处理多少个请求才能应对? 你想建设一个能承受500万PV/每天的网站吗? 500万PV是什么概念?服务器每秒要处理多少个请求才能应对?如果计算 ...
- 假如想要建设一个能承受500万PV/每天的网站,服务器每秒要处理多少个请求才能应对?
假如想要建设一个能承受500万PV/每天的网站,服务器每秒要处理多少个请求才能应对?如何计算? 1.PV是什么:PV是page view的简写.PV是指页面的访问次数,每打开或刷新一次页面,就算做一个 ...
- zk请求和响应对
zk的请求和响应是通过id对应上的: 请求头(RequestHeader)和响应头(ReplyHeader)共用一个xid,它的本质是ClientCnxn类中的一个计数器. 1. 首先看客户端: Pa ...
- 懂得三境界-使用dubbo时请求超过问题
引子 刚才下班回家路上,无意中听到大街上放的歌,歌词有这么一句:"毡房外又有驼铃声声响起,我知道那一定不是你".这一句我似乎听懂了歌者的魂牵梦绕和绝望,如果在十年前我大概只能感受出 ...
- 8.DRF请求响应和api_view
一.请求对象(Request objects) DRF引入了一个扩展Django常规HttpRequest对象的Request对象,并提供了更灵活的请求解析能力 Request对象的核心功能是re ...
- 使用PHP实现请求响应和MySql访问
在iOS开发当中经常需要使用来自后台的数据,所以使用一种很简便的写后台的方法. 首先,安装XAMPP,这是一个集成好的阿帕奇+MySQL环境,点击按钮即可开启服务,不需要进行任何环境配置. 然后,开启 ...
- 再看Ajax
再回顾Ajax相关的内容,再次梳理学习还是很有必要的,尤其是实际的开发中,ajax更是必不可少,仔细学习以便避免不必要的错误. 文章导读: --1.使用XMLHttpRequest---------- ...
- 第十六章:脚本化HTTP
写在本章内容前: 第十五章:事件处理 涉及到到较多的文字篇幅,介于个人精力问题,暂不更新.主要包含的内容有事件类型.注册事件处理程序.事件处理程序的调用.文档加载事件.鼠标事件.鼠标滚轮事件.拖放事件 ...
- Ajax技术详解
Ajax技术:Ajax描述了一种主要使用脚本(JS)操纵HTTP的web应用架构,它的主要特点是使用脚本操纵HTTP和web服务器进行数据交换,不会导致页面重载.Ajax的核心是JS的XMLHttpR ...
随机推荐
- POJO/VO/DTO等对象模型
JavaBean 要想成为JavaBean,需要满足以下条件: 1,提供一个默认的无参构造函数. 2,需要被序列化并且实现了Serializable接口. 3,可能有一系列可读写属性伴随"g ...
- c++ sleep(windows/linux)
c标准中包含了一个sleep用以实现当前线程暂停执行n毫秒,如下所示: 函数名: sleep 功 能: 执行挂起一段时间 用 法: unsigned sleep(unsigned seconds); ...
- Observer模式实践
Observer 模式在实践中的应用场景: 为 Point 类设计一个数据绑定机制,当其坐标 x 或 y 被更改时,可以通知外界其更改的过程.将更改过程打印在控制台上.考虑使用松耦合设计. 代码: # ...
- C++ 表示一个区间值得方法
C++中不允许这样的写法 85<= score <=100;你要想表示85<=score<=100的话只能这么写score>=85&&score<= ...
- Package libvirt was not found in the pkg-config search path
关于pip安装libvirt-python的时候提示Package libvirt was not found in the pkg-config search path的问题解决方法 1.一开始以为 ...
- Python3基础 list str转成list
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- bootstrap的 附加导航Affix导航 (侧边窄条式 滚动监控式导航) 附加导航使用3.
affix: 意思是粘附, 附着, 沾上. 因此, 附加导航就是 bootstrap的 Affix.js组件. bootstrap的 附加导航, 不是说导航分成主导航, 或者什么 副导航的 而是指, ...
- Unity3D学习笔记(四):物理系统碰撞和预制体
Rigidbody(刚体组件):加了此组件游戏物体就变成刚体了 ----Mass(质量,单位kg):重力G = 质量m * 重力加速度g(g=9.81 m/s^2) --------冲量守恒定理 动量 ...
- Spring security框架原理
转自: http://www.blogjava.net/youxia/archive/2008/12/07/244883.html 在SpringSide 3的官方文档中,说安全框架使用的是Spri ...
- org.apache.axis2.AxisFault: java.lang.Error: Unresolved compilation problem:
原创:转载请注明出处 今天遇到以下一个异常,找了好长时间,就是不知道什么原因, 在网上搜了好多,也没搜到相关的解决方法. 1.异常展示, org.apache.axis2.AxisFault: jav ...