欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Axis2-1.6.2 HTTPS/SSL非常慢,解决思路

程序员文章站 2022-04-11 15:35:27
...

最近有个项目需要由axis1.4升级到axis2-1.6.2,原因是由于axis1版本无法控制连接超时时间,只支持设置readtimeout.故需要升级。

实验环境如下: 
服务器是Windows 2008 R2 + IIS+ C#,SSL双向认证 
客户端是Windows 7 + Axis2-1.6.2

项目是基于HTTPS访问Web service,axis1连接正常,速度正常,升级到axis2后

,通过SSL调用服务时,建立连接的速度变得非常非常慢。,通常需要30s多。


然后考虑到需要跟踪源代码,下了各种源代码包。虽然在Axis2里找到了导致速度缓慢的代码,但那里的Axis2只是调用Httpclient的方法,没办法,只好再跟踪Httpclient的源代码,发现导致问题的代码又在Axiom中,继续跟踪Axiom的源代码,最后发现问题出在OutputStream.flush()上,SSL时,这个flush相当费时,因为Axis2调用Web service本质上还是向服务器POST一个请求,所以我怀疑要么Httpclient哪里出了问题要么Axis2哪里出了问题。同时在服务器端,我用Soapmonitor监控请求,发现速度缓慢的问题的确是出在客户端这边。 

最后研究了大量文章,如下方法可解决速度慢的问题: 

Axis2-1.6.2  HTTPS/SSL非常慢,解决思路
            
    
    博客分类: axis2 axis2httpsssl慢host           //  If the SO_TIMEOUT of CONNECTION_TIMEOUT is set by dynamically the
Axis2-1.6.2  HTTPS/SSL非常慢,解决思路
            
    
    博客分类: axis2 axis2httpsssl慢host         
 //  override the static config 
Axis2-1.6.2  HTTPS/SSL非常慢,解决思路
            
    
    博客分类: axis2 axis2httpsssl慢host 
         Integer tempSoTimeoutProperty  = 
Axis2-1.6.2  HTTPS/SSL非常慢,解决思路
            
    
    博客分类: axis2 axis2httpsssl慢host                 (Integer) msgContext.getProperty(HTTPConstants.SO_TIMEOUT);
Axis2-1.6.2  HTTPS/SSL非常慢,解决思路
            
    
    博客分类: axis2 axis2httpsssl慢host         Integer tempConnTimeoutProperty 
 = 
Axis2-1.6.2  HTTPS/SSL非常慢,解决思路
            
    
    博客分类: axis2 axis2httpsssl慢host                 (Integer) msgContext
Axis2-1.6.2  HTTPS/SSL非常慢,解决思路
            
    
    博客分类: axis2 axis2httpsssl慢host                         .getProperty(HTTPConstants.CONNECTION_TIMEOUT);
Axis2-1.6.2  HTTPS/SSL非常慢,解决思路
            
    
    博客分类: axis2 axis2httpsssl慢host         
 long  timeout  =  msgContext.getOptions().getTimeOutInMilliSeconds();
Axis2-1.6.2  HTTPS/SSL非常慢,解决思路
            
    
    博客分类: axis2 axis2httpsssl慢host 
Axis2-1.6.2  HTTPS/SSL非常慢,解决思路
            
    
    博客分类: axis2 axis2httpsssl慢host         
 if  (tempConnTimeoutProperty  !=   null  {
Axis2-1.6.2  HTTPS/SSL非常慢,解决思路
            
    
    博客分类: axis2 axis2httpsssl慢host             
int connectionTimeout = tempConnTimeoutProperty.intValue();
Axis2-1.6.2  HTTPS/SSL非常慢,解决思路
            
    
    博客分类: axis2 axis2httpsssl慢host             
// timeout for initial connection
Axis2-1.6.2  HTTPS/SSL非常慢,解决思路
            
    
    博客分类: axis2 axis2httpsssl慢host 
            httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(connectionTimeout);
Axis2-1.6.2  HTTPS/SSL非常慢,解决思路
            
    
    博客分类: axis2 axis2httpsssl慢host         }
   else   {
Axis2-1.6.2  HTTPS/SSL非常慢,解决思路
            
    
    博客分类: axis2 axis2httpsssl慢host             
// set timeout in client
Axis2-1.6.2  HTTPS/SSL非常慢,解决思路
            
    
    博客分类: axis2 axis2httpsssl慢host 
            if (timeout > 0{
Axis2-1.6.2  HTTPS/SSL非常慢,解决思路
            
    
    博客分类: axis2 axis2httpsssl慢host                 httpClient.getHttpConnectionManager().getParams().setConnectionTimeout((
int) timeout);
Axis2-1.6.2  HTTPS/SSL非常慢,解决思路
            
    
    博客分类: axis2 axis2httpsssl慢host             }

Axis2-1.6.2  HTTPS/SSL非常慢,解决思路
            
    
    博客分类: axis2 axis2httpsssl慢host         }
 
Axis2-1.6.2  HTTPS/SSL非常慢,解决思路
            
    
    博客分类: axis2 axis2httpsssl慢host 

Axis2默认状态下设置了httpclient的超时为30000MS。而我用Httpclient写的客户端中并没有设置超时(因为参考的Httpclient网站的例子中也未设置超时)。问题似乎就处在这里,我在我写的Httpclient客户端中,添加了设置超时的代码:client.getHttpConnectionManager().getParams().setConnectionTimeout(30000),结果果然建立SSL连接时变得非常非常慢,如果将超时设置为0,那么速度恢复正常。 

因此,在调用Axis2写的客户端中设置options.setProperty(HTTPConstants.CONNECTION_TIMEOUT, 0),那么SSL连接的速度会正常,而重用SESSION的作用似乎对提升速度并不明显。 
            但是以上解决方案又违背了axis1升级到axis2控制连接超时时间的初衷,故有去研究了相关文章,最后发现了个貌似是正确的解决方案,那就是去设置host。事实证明这个方法是正确的,不但连接正常了,而且可以正常控制连接超时时间。哈哈哈,终于解决了,痛苦的过程。

          host文件新增一行:   webservice 服务的IP地址即可。

猜测引起变慢的原因大概是域名反向解析引起的。吼吼,希望有大神给出解答。