20

由於WS客戶端端口的初始化過於昂貴,我們希望重用相同的實例。我們還希望在每次調用之前在BindingProvider/RequestContext中設置不同的值。最初,我們想做到這一點:JAX-WS客戶端是否安全?

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

再後來,每次調用來完成這一點:

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

我的問題是,是這樣的代碼線程安全的? JAX-WS文檔似乎表明它是而不是線程安全。但是,CXF seems to be so if you take precautions。如果特別是JAX-WS和Metro不是線程安全的,有沒有什麼方法可以確保線程安全,而無需同步對端口或ws操作的訪問?

+0

這是不明確的規格。檢查這個例子:http://community.jboss.org/message/526321 – Cratylus 2010-12-08 08:47:03

回答

14

對於JAX-WS/Metro,這絕對不是線程安全的。最好的辦法是創建一個代理池,並在需要時從池中提取代理,配置它,使用它,清除設置值,返回池。

或使用CXF。

+2

謝謝丹尼爾,這也是我的懷疑,但你有任何官方的參考證實了這一點? – 2011-02-28 13:08:18