2011-05-12 68 views
4

WSDL2JAVA(使用XMLBean绑定选项)是否通过Axis2 1.5.4线程安全生成存根(stub)?Axis2生成的存根是线程安全的?

其实我已经为我通过多线程调用的Web服务创建了一个存根。我已经配置了自己的MultiThreadedHttpConnectionmanager并设置了HTTPConstants.REUSE_HTTP_CLIENT,但我在每次调用后都会看到stub._getServiceClient().cleanupTransport中的一些NullPointerException。

有时线程也挂起。

同时我注意到,在Web Service操作方法中生成的Stub中,cleanup()在finally块中已被调用。事后我不应该打电话给stub._getServiceClient().cleanupTransport吗?

我的代码:

 httpConnMgr = new MultiThreadedHttpConnectionManager(); 
     HttpConnectionManagerParams params = httpConnMgr.getParams(); 
     if (params == null) { 
      params = new HttpConnectionManagerParams(); 

     } 
     params.setDefaultMaxConnectionsPerHost(numberOfThreads); 
     httpConnMgr.setParams(params); 
     HttpClient httpClient = new HttpClient(httpConnMgr); 

     service = new Service1Stub(this.endPointAddress); 
     service._getServiceClient().getOptions() 
       .setTimeOutInMilliSeconds(this.timeOut); 
     service._getServiceClient().getOptions() 
       .setProperty(HTTPConstants.REUSE_HTTP_CLIENT, Boolean.TRUE); 
     service._getServiceClient().getOptions() 
     .setProperty(HTTPConstants.AUTO_RELEASE_CONNECTION, Boolean.FALSE); 
     service._getServiceClient() 
       .getOptions() 
       .setProperty(HTTPConstants.SO_TIMEOUT, (int) (this.timeOut)); 
     service._getServiceClient() 
       .getOptions() 
       .setProperty(HTTPConstants.CONNECTION_TIMEOUT, 
         (int) (this.timeOut)); 
     service._getServiceClient().getServiceContext().getConfigurationContext() 
       .setProperty(HTTPConstants.CACHED_HTTP_CLIENT, httpClient); 

与此同时,在生成的存根,我注意到,清理已经被称为:

finally { 
      _messageContext.getTransportOut().getSender().cleanup(_messageContext); 
     } 

任何建议将是很大的帮助。谢谢。

回答

7

前段时间我看了一下Axis2,我也有关于它的线程安全的相关问题。

查找有关Axis2的线程安全信息是困难的,但是我终于结束了以下JIRA问题:https://issues.apache.org/jira/browse/AXIS2-4357

要提到的是:

的Axis2客户端不是线程安全的,并是从项目开始的情况下,[...]使用不同的存根不同的线程[...]

问题本身是封闭的一个​​地位和以下说明:

Axis2存根不是线程安全的。 Deepal指出这是设计。

那就是那个时候为我做的。

基本上你需要每个线程使用一个存根,或者你可以使用一个存根池(如果我没有记错的话)存根可以被重用(但仍然需要使用每个线程的一个存根来避免任何问题)。其他似乎已成功使用存根池(see related SO question here)。

一个建议,我通常遵循关于线程安全性:如果没有明确指出什么是线程安全的,那么假设它是不是

+1

这就是关键:如果没有明确指出某件事是线程安全的,那么就假设它不是。 – 2014-09-01 20:40:50

相关问题