2012-10-30 92 views
6

我正在使用CXF來生成SOAP客戶端類。在CXF documentation中,他們寫出CXF客戶端代理是否線程安全?

JAX-WS客戶端代理是否線程安全?

官方JAX-WS回答:不可以。根據JAX-WS規範,客戶端代理不是線程安全的。要編寫可移植的代碼,您應該將它們視爲非線程安全並同步訪問或使用實例池或類似的池。

CXF答案:CXF代理對於很多用例都是線程安全的。唯一的例外是:

(我省略了這些用例描述)

對於最「簡單」的使用情況,您可以在多線程使用CXF代理。以上概述了其他方法的解決方法。

有沒有人有任何相反的經歷?遇到未在其常見問題解答中描述的多線程問題?或者他們的描述是否準確,基本上可以安全使用?

+0

這是什麼意思?這是否意味着由CXF'wsdl2java' **生成的客戶端代理**(主要)是線程安全的,還是您需要在您的客戶端程序中使用任何實際的CXF API? –

+0

@MaartenBoekhold我的意思是生成的客戶端代理。 – Eyal

回答

6

我們最近在我們的項目中遇到類似的討論。 正如您所指的FAQ中所指定的那樣,除了動態修改HTTP管道的功能(例如:會話管理和故障轉移功能)之外,CXF客戶端代理是線程安全的。 因此,如果您不使用這些功能,那麼在線程之間共享客戶端代理是可以的。

1

你可能指的是運行時,但我不認爲配置時間是線程安全的。我相信我在JettyHTTPServerEngineFactory中看到了競爭狀態。

在一個測試工具中,我們調出多個不相關的SOAP服務器,當它們共享一個總線時,如果多個線程同時嘗試添加JettyHTTPServerEngine實例,則存在爭用條件的可能性。特定的競爭條件位於setTLSServerParametersForPort()中,當您想要爲端口使用HTTPS時調用該條件。該方法將元素添加到沒有鎖定的HashMap中。

我猜別人不會遇到這種情況的原因是大多數人通過配置文件來配置CXF,並且在一個進程中很少有多個端口/ Jetty服務器。

+0

事實證明CXF的更新版本修復了這種特殊的競爭條件,但我還沒有看到CXF文檔中線程的最終合同。此外,地圖是靜態的,所以不管總線如何,舊版本的競爭條件都會發生。 –