2011-05-12 1 views
4

Les stubs sont-ils générés par WSDL2JAVA (en utilisant l'option de liaison XMLBeans) via Axis2 1.5.4 thread-safe?Les Stubs générés par Axis2 sont thread-safe?

En fait, j'ai créé un Stub pour un service Web que j'appelle par le biais de plusieurs threads. J'ai configuré mon propre MultiThreadedHttpConnectionmanager et ai également défini le HTTPConstants.REUSE_HTTP_CLIENT mais je vois quelques exceptions NullPointer dans stub._getServiceClient().cleanupTransport que j'appelle après chaque invocation.

Parfois, les threads sont également suspendus.

En même temps, j'ai remarqué que dans la méthode d'exécution Stub dans le service Web, cleanup() est déjà appelé dans le bloc finally. Est-ce que je ne devrais pas appeler stub._getServiceClient().cleanupTransport moi-même après?

Mon code:

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

Pendant ce temps dans le stub généré, je remarque que cleanUp est déjà appelé:

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

Toute suggestion serait grandement utile. Merci.

Répondre

7

Lorsque j'ai regardé Axis2 il y a quelque temps, j'avais aussi des questions relatives à la sécurité des threads à ce sujet.

Recherche d'informations sur la sécurité des threads de Axis2 était difficile, mais je me suis finalement fini avec la question Jira suivante: https://issues.apache.org/jira/browse/AXIS2-4357

Il est mentionné que:

côté client Axis2 est pas thread-safe, et qui a été le cas depuis le début du projet [...] utiliser des talons différents pour différents threads [...]

la question elle-même est fermée avec un statut Won't Fix et la note suivante:

Les tronçons Axis2 ne sont pas thread-safe. Comme Deepal a souligné que c'est par conception.

Cela l'a fait pour moi à ce moment-là. Fondamentalement, vous devez utiliser un seul talon par thread ou vous pouvez utiliser un talon car (si je me souviens bien) les talons peuvent être réutilisés (mais toujours besoin d'utiliser un talon par thread pour éviter tout problème). D'autres semblent avoir utilisé avec succès les bassins de bouchage (see related SO question here).

Un conseil que je suis habituellement en ce qui concerne la sécurité de fil est: S'il n'est pas explicitement déclaré que quelque chose est thread-safe, alors supposez qu'il n'est pas.

+1

Voilà le point: S'il n'est pas explicitement indiqué que quelque chose est sûr, alors supposons que ce n'est pas le cas. –

Questions connexes