Hessian在客户端一块采用Proxy模式,当客户端调用远程接口时,HessianProxy会代理这个动作,在invoke方法中,把客户端请求的方法和参数序列化为预订格式的输出流,主要流程如下图所示:
下面我将详细解析一下invoke源码:
-
publicObjectinvoke(Objectproxy,Methodmethod,Object[]args)
-
throwsThrowable
-
{
-
StringmangleName;
-
synchronized(_mangleMap){
-
mangleName=_mangleMap.get(method);
-
}
-
if(mangleName==null){
-
StringmethodName=method.getName();
-
Class[]params=method.getParameterTypes();
-
-
if(methodName.equals("equals")
-
&¶ms.length==1&¶ms[0].equals(Object.class)){
-
Objectvalue=args[0];
-
if(value==null||!Proxy.isProxyClass(value.getClass()))
-
returnnewBoolean(false);
-
HessianProxyhandler=(HessianProxy)Proxy.getInvocationHandler(value);
-
returnnewBoolean(_url.equals(handler.getURL()));
-
}
-
elseif(methodName.equals("hashCode")&¶ms.length==0)
-
returnnewInteger(_url.hashCode());
-
elseif(methodName.equals("getHessianType"))
-
returnproxy.getClass().getInterfaces()[0].getName();
-
elseif(methodName.equals("getHessianURL"))
-
return_url.toString();
-
elseif(methodName.equals("toString")&¶ms.length==0)
-
return"HessianProxy["+_url+"]";
-
-
if(!_factory.isOverloadEnabled())
-
mangleName=method.getName();
-
else
-
mangleName=mangleName(method);
-
synchronized(_mangleMap){
-
_mangleMap.put(method,mangleName);
-
}
-
}
-
......
-
}
这是invoke的开头,主要干的事情是把methodName缓存起来和过滤一些特殊调用,java反射是个比较耗性能的操作,把methodName缓存起来可以避免每次调用都要从method里得到methodName。另外,对equals、hashCode、getHessianType、getHessianURL等特殊方法的远程调用,HessianProxy不会走远程调用,而是直接返回。
接着往下看:
-
publicObjectinvoke(Objectproxy,Methodmethod,Object[]args)
-
throwsThrowable
-
{
-
......
-
InputStreamis=null;
-
URLConnectionconn=null;
-
HttpURLConnectionhttpConn=null;
-
-
try{
-
-
conn=sendRequest(mangleName,args);
-
......
-
}catch(HessianProtocolExceptione){
-
thrownewHessianRuntimeException(e);
-
}finally{
-
......
-
}
-
}
这段主要是把方法名和参数序列化为网络输出流,并做网络请求,具体逻辑包装在sendRequest方法中:
-
protectedURLConnectionsendRequest(StringmethodName,Object[]args)
-
throwsIOException
-
{
-
URLConnectionconn=null;
-
-
conn=_factory.openConnection(_url);
-
booleanisValid=false;
-
try{
-
-
if(_factory.isChunkedPost()&&conninstanceofHttpURLConnection){
-
try{
-
HttpURLConnectionhttpConn=(HttpURLConnection)conn;
-
httpConn.setChunkedStreamingMode(8*1024);
-
}catch(Throwablee){
-
}
-
}
-
-
addRequestHeaders(conn);
-
OutputStreamos=null;
-
try{
-
os=conn.getOutputStream();
-
}catch(Exceptione){
-
thrownewHessianRuntimeException(e);
-
}
-
if(log.isLoggable(Level.FINEST)){
-
PrintWriterdbg=newPrintWriter(newLogWriter(log));
-
os=newHessianDebugOutputStream(os,dbg);
-
}
-
-
AbstractHessianOutputout=_factory.getHessianOutput(os);
-
out.call(methodName,args);
-
out.flush();
-
isValid=true;
-
returnconn;
-
}finally{
-
if(!isValid&&conninstanceofHttpURLConnection)
-
((HttpURLConnection)conn).disconnect();
-
}
-
}
sendRequest的主要流程是先初始化网络连接,然后用AbstractHessianOutput包装网络输出流,调用AbstractHessianOutput.call(methodName, args)完成网络输出,这个方法的细节会在hessian io的源码解析中详细分析。
下面接着看invoke方法:
-
publicObjectinvoke(Objectproxy,Methodmethod,Object[]args)
-
throwsThrowable
-
{
-
......
-
is=conn.getInputStream();
-
AbstractHessianInputin=_factory.getHessianInput(is);
-
in.startReply();
-
Objectvalue=in.readObject(method.getReturnType());
-
if(valueinstanceofInputStream){
-
value=newResultInputStream(httpConn,is,in,(InputStream)value);
-
is=null;
-
httpConn=null;
-
}
-
else
-
in.completeReply();
-
......
-
}
这一段主要是把输入流中取得返回值,具体是用AbstractHessianInput包装网络输入流,然后调用AbstractHessianInput.readObject从网络流中反序列化到实际返回值。
分享到:
相关推荐
com.alibaba:hessian-lite:jar:3.2.1-fixed-2 hessian-lite hessian-lite-3.2.1-fixed-2.jar
二进制Web服务Hessian刘骥讲座--(附源码) 二进制Web服务Hessian刘骥讲座--(附源码) 二进制Web服务Hessian刘骥讲座--(附源码)
赠送jar包:hessian-3.3.6.jar 赠送原API文档:hessian-3.3.6-javadoc.jar 赠送源代码:hessian-3.3.6-sources.jar 包含翻译后的API文档:hessian-3.3.6-javadoc-API文档-中文(简体)-英语-对照版.zip 对应Maven...
赠送jar包:hessian-3.3.6.jar; 赠送原API文档:hessian-3.3.6-javadoc.jar; 赠送源代码:hessian-3.3.6-sources.jar; 赠送Maven依赖信息文件:hessian-3.3.6.pom; 包含翻译后的API文档:hessian-3.3.6-javadoc-...
赠送jar包:hessian-4.0.63.jar; 赠送原API文档:hessian-4.0.63-javadoc.jar; 赠送源代码:hessian-4.0.63-sources.jar; 赠送Maven依赖信息文件:hessian-4.0.63.pom; 包含翻译后的API文档:hessian-4.0.63-...
hessian是一个轻量级的Java Remoting方案
赠送jar包:hessian-4.0.63.jar; 赠送原API文档:hessian-4.0.63-javadoc.jar; 赠送源代码:hessian-4.0.63-sources.jar; 赠送Maven依赖信息文件:hessian-4.0.63.pom; 包含翻译后的API文档:hessian-4.0.63-...
Hessian 框架源码jar包 hessian-4.0.7-src.jar
hessian源码
hessian-4.0.7 hessian-4.0.7源代码 hessian-4.0.7jar文件
java运行依赖jar包
Hessian是一个轻量级的remoting onhttp工具,使用简单的方法提供了RMI的功能。 相比WebService,Hessian更简单、快捷。采用的是二进制RPC协议,因为采用的是二进制协议,所以它很适合于发送二进制数据。
sofa-hessian-node 蚂蚁金服对 Hessian 序列化的定制版本 sofa-hessian-node 对应的 Java Hessian 版本是 v3.1.3。它对 模块做了进一步封装,通过预编译来提高性能。 安装 $ npm install sofa-hessian-node --save ...
hessian-3.2.0源码,在做分布式交互时,可能要重写hessian
项目选定Hessian作为web service的实现方式,确实很轻量级,速度就跟直接用socket差不多,全是二进制传送节约了不少开销。但是在使用过程中有业务需要是必须获得远程端的ip地址,主机名等信息的。翻便Hessian的文档...
Hessian 4.0.7 Jar 源码, Hessian 4.0.7 Jar 源码, Hessian 4.0.7 Jar 源码
hessian4.0.51源码包,使用JDK1.7,Maven构建,直接导入可用
一些很难找的JAR,希望对你们有用。 hessian开发包 hessian-3.0.20.jar 可以仔细看看
hessian最新源码分析.pdf