zoukankan      html  css  js  c++  java
  • JAVA中使用HTTP 1.1提高基于AXIS 1.4的web service的性能

    HTTP 1.1会在第一次连接的时候进行认证, 而在一定时间内保持连接而不用重新验证. 一般情形下,每个web service请求都会在web service服务端验证, 而验证会消耗很多时间, 因此改进或减少验证的次数, 并且使用HTTP 1.1来保持长时间连接能够极大的提高web service性能.

    JAVA中使用Axis 1.4时,默认使用HTTP 1.0来传输web service请求.因此需要配置其使用HTTP 1.1.

    以下是配置Axis 1.4使用HTTP 1.1的方法:

    1. 配置Axis使用CommonsHTTPSender代替默认的HTTPSender.
    方法可查看apache的wiki: http://wiki.apache.org/ws/FrontPage/Axis/AxisCommonsHTTP

    如果缺乏配置client-config.wsdd的条件(比如没权限碰环境,或者是某个共享环境), 可以换个方式在代码里强制调用:

         EngineConfiguration defaultConfig = EngineConfigurationFactoryFinder.newFactory().getClientEngineConfig(); 
         SimpleProvider config = new SimpleProvider(defaultConfig); 
         config.deployTransport(HTTPTransport.DEFAULT_TRANSPORT_NAME,new CommonsHTTPSender()); 
         ServiceLocator locator = new ServiceLocator(config);

    2. 使locator静态化: 
             ServiceLocator必须只实例化一次. 然后在所有stub中共用. 之所以如此是因为ServiceLocator管理着http connection的连接池, 它通过CommonsHTTPSender的引用管理着MultiThreadedHttpConnectionManager.

    3. 在每个请求(stub)中都发送web service的用户名和密码. 默认情况下axis不会在每个请求初始的时候发送用户名密码, 此时服务器会返回401标志(unauthorized error), 而401标志会要求提供用户名密码然后重做登陆验证, 因此为了拒绝出现401登陆的情形, 每次都应该主动提供用户名和密码.在代码中可以这么写:

         Hashtable headers = new Hashtable(); 
         headers.put(HTTPConstants.HEADER_AUTHORIZATION, "Basic " + Base64.encode(username + ":" + password).getBytes()));
         stub._setProperty(HTTPConstants.REQUEST_HEADERS, headers);

    或者:

         System.setProperty("httpclient.authentication.preemptive", "true"); 
         然后 
         stubServicePort._setProperty(Call.USERNAME_PROPERTY, username); 
         stubServicePort._setProperty(Call.PASSWORD_PROPERTY, password);

    本质上是一样的, 后者只是通过调节asix中包含的httpclient包来达到目的而已.

    以上代码表示在每次都在SOAP头部中包含Basic验证的Base64加密的用户名:密码的字符串.也因此推荐对web service使用https连接(如果是内网就不必了), 当然这个本来也是要在网络中传递的, 与是否使用了这个方案无关.

    实际的效果表明这个方案很有效, 我的案例是从每次6-7秒(大部分是登陆验证时间, 而这个验证的方法是别人维护的)降到了0.5秒.

  • 相关阅读:
    「UVA12293」 Box Game
    「CF803C」 Maximal GCD
    「CF525D」Arthur and Walls
    「CF442C」 Artem and Array
    LeetCode lcci 16.03 交点
    LeetCode 1305 两棵二叉搜索树中的所有元素
    LeetCode 1040 移动石子直到连续 II
    LeetCode 664 奇怪的打印机
    iOS UIPageViewController系统方法崩溃修复
    LeetCode 334 递增的三元子序列
  • 原文地址:https://www.cnblogs.com/qqzy168/p/3193585.html
Copyright © 2011-2022 走看看