20

Da die Initialisierung des WS-Client-Side-Ports so kostspielig ist, möchten wir dieselbe Instanz wiederverwenden. Wir möchten auch vor jedem Aufruf unterschiedliche Werte im BindingProvider/RequestContext setzen. Zunächst möchten wir dies tun:Sind JAX-WS-Clients Thread-sicher?

MyService service = new MyService(wsdlURL, name); 
MyPort myPort = service .getMyServicePort(); 

dann später vor jedem Anruf dies tun:

Map requestContext = ((BindingProvider)myPort).getRequestContext(); 
requestContext.put(BindingProvider.USERNAME_PROPERTY, uName); 
requestContext.put(BindingProvider.PASSWORD_PROPERTY, pWord); 
myPort.someFunctionCall(); 

Meine Frage ist, ist dieser Code Thread-sicher? JAX-WS-Dokumentation scheint darauf hinzuweisen, dass es nicht Thread-sicher ist. Jedoch, CXF seems to be so if you take precautions. Wenn insbesondere JAX-WS und Metro nicht Thread-sicher sind, gibt es irgendeine Möglichkeit, Thread-Sicherheit zu gewährleisten, ohne den Zugriff auf Port- oder WS-Operationen zu synchronisieren?

+0

Dies ist nicht klar aus den Spezifikationen. Überprüfen Sie dies zum Beispiel: http: //community.jboss.org/message/526321 – Cratylus

Antwort

14

Für JAX-WS/Metro ist das definitiv nicht threadsicher. Am besten erstellen Sie einen Proxypool und ziehen bei Bedarf einen Proxy aus dem Pool, konfigurieren ihn, verwenden ihn, löschen die gesetzten Werte und kehren zum Pool zurück.

Oder verwenden Sie CXF.

+2

Danke Daniel, das war mein Verdacht auch, aber haben Sie eine offizielle Referenz, die dies bestätigt? –

+0

Sieht aus wie ein altes Ding ... aber sehr aktuell für mich. @ Daniel was meinst du damit, die eingestellten Werte zu putzen ... Ich interessiere mich dafür, dass ich das ohne zu viel Erfolg gefragt habe: http: //stackoverflow.com/questions/6882528/weblogic-webservice-clients-clean-referenzen – Cris

+0

Für JAX-WS/Metro ist das seit sehr langer Zeit definitiv threadsicher. – rustyx