Hessian在客户端一块采用Proxy模式,当客户端调用远程接口时,HessianProxy会代理这个动作,在invoke方法中,把客户端请求的方法和参数序列化为预订格式的输出流,主要流程如下图所示:
下面我将详细解析一下invoke源码:
- public Object invoke(Object proxy, Method method, Object []args)
- throws Throwable
- {
- String mangleName;
- synchronized (_mangleMap) {
- mangleName = _mangleMap.get(method);
- }
- if (mangleName == null) {
- String methodName = method.getName();
- Class []params = method.getParameterTypes();
- // equals and hashCode are special cased
- if (methodName.equals("equals")
- && params.length == 1 && params[0].equals(Object.class)) {
- Object value = args[0];
- if (value == null || ! Proxy.isProxyClass(value.getClass()))
- return new Boolean(false);
- HessianProxy handler = (HessianProxy) Proxy.getInvocationHandler(value);
- return new Boolean(_url.equals(handler.getURL()));
- }
- else if (methodName.equals("hashCode") && params.length == 0)
- return new Integer(_url.hashCode());
- else if (methodName.equals("getHessianType"))
- return proxy.getClass().getInterfaces()[0].getName();
- else if (methodName.equals("getHessianURL"))
- return _url.toString();
- else if (methodName.equals("toString") && params.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不会走远程调用,而是直接返回。
接着往下看:
- public Object invoke(Object proxy, Method method, Object []args)
- throws Throwable
- {
- ......
- InputStream is = null;
- URLConnection conn = null;
- HttpURLConnection httpConn = null;
- try {
- conn = sendRequest(mangleName, args);
- ......
- } catch (HessianProtocolException e) {
- throw new HessianRuntimeException(e);
- } finally {
- ......
- }
- }
这段主要是把方法名和参数序列化为网络输出流,并做网络请求,具体逻辑包装在sendRequest方法中:
- protected URLConnection sendRequest(String methodName, Object []args)
- throws IOException
- {
- URLConnection conn = null;
- conn = _factory.openConnection(_url);
- boolean isValid = false;
- try {
- // Used chunked mode when available, i.e. JDK 1.5.
- if (_factory.isChunkedPost() && conn instanceof HttpURLConnection) {
- try {
- HttpURLConnection httpConn = (HttpURLConnection) conn;
- httpConn.setChunkedStreamingMode(8 * 1024);
- } catch (Throwable e) {
- }
- }
- addRequestHeaders(conn);
- OutputStream os = null;
- try {
- os = conn.getOutputStream();
- } catch (Exception e) {
- throw new HessianRuntimeException(e);
- }
- if (log.isLoggable(Level.FINEST)) {
- PrintWriter dbg = new PrintWriter(new LogWriter(log));
- os = new HessianDebugOutputStream(os, dbg);
- }
- AbstractHessianOutput out = _factory.getHessianOutput(os);
- out.call(methodName, args);
- out.flush();
- isValid = true;
- return conn;
- } finally {
- if (! isValid && conn instanceof HttpURLConnection)
- ((HttpURLConnection) conn).disconnect();
- }
- }
sendRequest的主要流程是先初始化网络连接,然后用AbstractHessianOutput包装网络输出流,调用AbstractHessianOutput.call(methodName, args)完成网络输出,这个方法的细节会在hessian io的源码解析中详细分析。
下面接着看invoke方法:
- public Object invoke(Object proxy, Method method, Object []args)
- throws Throwable
- {
- ......
- is = conn.getInputStream();
- AbstractHessianInput in = _factory.getHessianInput(is);
- in.startReply();
- Object value = in.readObject(method.getReturnType());
- if (value instanceof InputStream) {
- value = new ResultInputStream(httpConn, is, in, (InputStream) value);
- is = null;
- httpConn = null;
- }
- else
- in.completeReply();
- ......
- }
这一段主要是把输入流中取得返回值,具体是用AbstractHessianInput包装网络输入流,然后调用AbstractHessianInput.readObject从网络流中反序列化到实际返回值。
相关推荐
hessian-lite-3.2.1-fixed-2.jar
赠送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-...
赠送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-...
赠送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-...
hessian是一个轻量级的Java Remoting方案
java运行依赖jar包
二进制Web服务Hessian刘骥讲座--(附源码) 二进制Web服务Hessian刘骥讲座--(附源码) 二进制Web服务Hessian刘骥讲座--(附源码)
hessian4.0.51源码包,使用JDK1.7,Maven构建,直接导入可用
hessian最新源码分析.pdf
Hessian 框架源码jar包 hessian-4.0.7-src.jar
hessian-3.1.6.jarhessian-3.1.6.jar
hessian-3.2.0源码,在做分布式交互时,可能要重写hessian
Hessian 4.0.7 Jar 源码, Hessian 4.0.7 Jar 源码, Hessian 4.0.7 Jar 源码
hessian-4.0.7 hessian-4.0.7源代码 hessian-4.0.7jar文件
hessian与flex接口 hessian-4.0.7.jar
Hessian是一个轻量级的remoting onhttp工具,使用简单的方法提供了RMI的功能。 相比WebService,Hessian更简单、快捷。采用的是二进制RPC协议,因为采用的是二进制协议,所以它很适合于发送二进制数据。
hessian源码