2011-05-12 4 views
4

(XMLBeans 바인딩 옵션을 사용하여) WSDL2JAVA에 의해 생성 된 스텁은 Axis2 1.5.4 스레드로부터 안전한가요?Axis2 생성 스텁은 스레드로부터 안전합니까?

실제로 여러 스레드를 통해 호출하는 웹 서비스 용 스텁을 하나 만들었습니다. 내 자신의 MultiThreadedHttpConnectionmanager 구성하고 HTTPConstants.REUSE_HTTP_CLIENT 설정하지만 각 호출 후 호출 있는 일부 NullPointerExceptions보고 있습니다.

간혹 스레드가 멈추는 경우가 있습니다.

동시에 웹 서비스 조작 메소드에서 생성 된 스텁에서 cleanup()이 finally 블록에서 이미 호출 된 것으로 나타났습니다. 나중에 stub._getServiceClient().cleanupTransport 번으로 전화하지 않아야하나요?

내 코드 :

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

어떤 제안이 크게 도움이 될 것입니다 :

 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); 

한편 생성 된 스텁에, 나는 정리가 이미 호출 된 것으로 확인되었습니다. 감사.

답변

7

얼마 전에 Axis2를 살펴봤을 때 스레드 관련 질문도있었습니다. Axis2와의 스레드 안전에 대한 정보를 찾기

는 어려웠지만 나는 마지막으로 다음과 같은 락스 문제로 결국 : https://issues.apache.org/jira/browse/AXIS2-4357

이 언급된다 :

Axis2는 클라이언트 측 스레드로부터 안전하지 않습니다, 어느 프로젝트의 시작부터 케이스 하였다 ...] 문제 자체가 Won't Fix 상태와 폐쇄된다

[...] 다른 스레드 다른 스텁을 사용 다음 참고 사항 :

Axis2 스텁은 스레드로부터 안전하지 않습니다. Deepal이 지적했듯이 이것은 의도적으로 설계된 것입니다.

그 때는 저 때문입니다.

기본적으로 스레드 당 하나의 스텁을 사용해야하거나 스텁 풀을 사용할 수 있습니다 (올바르게 기억하는 경우). 스텁을 재사용 할 수 있지만 스레드 당 하나의 스텁을 사용해야 문제가 발생하지 않습니다. 다른 스텁 풀을 사용하여 성공한 것 같습니다 (see related SO question here).

일반적으로 스레드 안전과 관련하여 다음과 같은 조언이 있습니다. 스레드 안전성이 명시 적으로 명시되지 않은 경우이 아닌 것으로 가정합니다.

+1

요점은 무엇인가 : 스레드 안전 인 명시 적으로 명시되지 않은 경우, 그렇지 않은 것으로 가정합니다. –

관련 문제