zoukankan      html  css  js  c++  java
  • hession

    hession 远程调用框架,
    粗略看了下源码,大致是一个客户端 通过代理模式创建代理对象,当代理对象去调用服务端的方法的时候 才去请求服务。(通过http协议post二进制数据过去) 
    服务端通过发送过来的方法名字和参数(反序列化) 调用服务端的方法返回。

    proxy+http+Serialization(代理模式,http请求,序列化)。

    1.当代理对象去调用服务端的方法的时候 才去请求服务  过程

    com.caucho.hessian.client.HessianProxy

     /**
       * Sends the HTTP request to the Hessian connection.
       */
      protected HessianConnection sendRequest(String methodName, Object []args)
        throws IOException
      {
        HessianConnection conn = null;
        
        conn = _factory.getConnectionFactory().open(_url);
        boolean isValid = false;
    
        try {
          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));
            HessianDebugOutputStream dOs = new HessianDebugOutputStream(os, dbg);
            dOs.startTop2();
            os = dOs;
          }
          
          AbstractHessianOutput out = _factory.getHessianOutput(os);
    
          out.call(methodName, args);
          out.flush();
    
          conn.sendRequest();
    
          isValid = true;
    
          return conn;
        } finally {
          if (! isValid && conn != null)
            conn.destroy();
        }
      }
    View Code

    通过java.net.URLConnection发生http post请求,连接获取过程

    com.caucho.hessian.client.HessianURLConnectionFactory

     /**
       * Opens a new or recycled connection to the HTTP server.
       */
      public HessianConnection open(URL url)
        throws IOException
      {
        if (log.isLoggable(Level.FINER))
          log.finer(this + " open(" + url + ")");
    
        URLConnection conn = url.openConnection();
    
        // HttpURLConnection httpConn = (HttpURLConnection) conn;
        // httpConn.setRequestMethod("POST");
        // conn.setDoInput(true);
    
        long connectTimeout = _proxyFactory.getConnectTimeout();
    
        if (connectTimeout >= 0)
          conn.setConnectTimeout((int) connectTimeout);
    
        conn.setDoOutput(true);
    
        long readTimeout = _proxyFactory.getReadTimeout();
    
        if (readTimeout > 0) {
          try {
            conn.setReadTimeout((int) readTimeout);
          } catch (Throwable e) {
          }
        }
    
        /*
        // Used chunked mode when available, i.e. JDK 1.5.
        if (_proxyFactory.isChunkedPost() && conn instanceof HttpURLConnection) {
          try {
            HttpURLConnection httpConn = (HttpURLConnection) conn;
    
            httpConn.setChunkedStreamingMode(8 * 1024);
          } catch (Throwable e) {
          }
        }
        */
        
        return new HessianURLConnection(url, conn);
      }
    View Code

    2.hession服务端

    开发时,spring-web包提供org.springframework.remoting.caucho.HessianServiceExporter类。

    <bean name="/**Service" class="org.springframework.remoting.caucho.HessianServiceExporter" depends-on="**Service">
    <property name="service" ref="**Service" />
    <property name="serviceInterface" value="**Service" />
    </bean>

    服务端接收请求过程

    请求通过dispatcherServlet类的doDispatch方法。

        /**
         * Process the actual dispatching to the handler.
         * <p>The handler will be obtained by applying the servlet's HandlerMappings in order.
         * The HandlerAdapter will be obtained by querying the servlet's installed HandlerAdapters
         * to find the first that supports the handler class.
         * <p>All HTTP methods are handled by this method. It's up to HandlerAdapters or handlers
         * themselves to decide which methods are acceptable.
         * @param request current HTTP request
         * @param response current HTTP response
         * @throws Exception in case of any kind of processing failure
         */
        protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
            HttpServletRequest processedRequest = request;
            HandlerExecutionChain mappedHandler = null;
            boolean multipartRequestParsed = false;
    
            WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
            try {
                ModelAndView mv = null;
                Exception dispatchException = null;
    
                try {
                    processedRequest = checkMultipart(request);
                    multipartRequestParsed = (processedRequest != request);
    
                    // Determine handler for the current request.
                    mappedHandler = getHandler(processedRequest);
                    if (mappedHandler == null || mappedHandler.getHandler() == null) {
                        noHandlerFound(processedRequest, response);
                        return;
                    }
    
                    // Determine handler adapter for the current request.
                    HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
    
                    // Process last-modified header, if supported by the handler.
                    String method = request.getMethod();
                    boolean isGet = "GET".equals(method);
                    if (isGet || "HEAD".equals(method)) {
                        long lastModified = ha.getLastModified(request, mappedHandler.getHandler());
                        if (logger.isDebugEnabled()) {
                            logger.debug("Last-Modified value for [" + getRequestUri(request) + "] is: " + lastModified);
                        }
                        if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                            return;
                        }
                    }
    
                    if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                        return;
                    }
    
                    // Actually invoke the handler.
                    mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
    
                    if (asyncManager.isConcurrentHandlingStarted()) {
                        return;
                    }
    
                    applyDefaultViewName(processedRequest, mv);
                    mappedHandler.applyPostHandle(processedRequest, response, mv);
                }
                catch (Exception ex) {
                    dispatchException = ex;
                }
                processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
            }
            catch (Exception ex) {
                triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
            }
            catch (Error err) {
                triggerAfterCompletionWithError(processedRequest, response, mappedHandler, err);
            }
            finally {
                if (asyncManager.isConcurrentHandlingStarted()) {
                    // Instead of postHandle and afterCompletion
                    if (mappedHandler != null) {
                        mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
                    }
                }
                else {
                    // Clean up any resources used by a multipart request.
                    if (multipartRequestParsed) {
                        cleanupMultipart(processedRequest);
                    }
                }
            }
        }
    View Code

    getHandlerAdapter

        /**
         * Return the HandlerAdapter for this handler object.
         * @param handler the handler object to find an adapter for
         * @throws ServletException if no HandlerAdapter can be found for the handler. This is a fatal error.
         */
        protected HandlerAdapter getHandlerAdapter(Object handler) throws ServletException {
            for (HandlerAdapter ha : this.handlerAdapters) {
                if (logger.isTraceEnabled()) {
                    logger.trace("Testing handler adapter [" + ha + "]");
                }
                if (ha.supports(handler)) {
                    return ha;
                }
            }
            throw new ServletException("No adapter for handler [" + handler +
                    "]: The DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler");
        }
    View Code

    通过下图可以知道有3个handleAdapter

    我们看下HttpRequestHandlerAdapter这个类

    public class HttpRequestHandlerAdapter implements HandlerAdapter {
    
        @Override
        public boolean supports(Object handler) {
            return (handler instanceof HttpRequestHandler);
        }
    
        @Override
        public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler)
                throws Exception {
    
            ((HttpRequestHandler) handler).handleRequest(request, response);
            return null;
        }
    
        @Override
        public long getLastModified(HttpServletRequest request, Object handler) {
            if (handler instanceof LastModified) {
                return ((LastModified) handler).getLastModified(request);
            }
            return -1L;
        }
    
    }
    View Code

    HessianServiceExporter类实现了HttpRequestHandler接口。

    所有这里返回HttpRequestHandlerAdapter。

    最后((HttpRequestHandler) handler).handleRequest(request, response) 去处理请求。

  • 相关阅读:
    如何学习新技术
    创建模式之工厂方法模式
    SQL Server 存储过程
    ASP.NET Cache的一些总结
    ACE_TSS研究
    利用Thunk让C++成员函数变回调函数
    ACE内存映射学习
    ACE的初始化
    双检锁模式学习
    ACE_Task笔记
  • 原文地址:https://www.cnblogs.com/shapeOfMyHeart/p/6219786.html
Copyright © 2011-2022 走看看