2011-07-08 165 views
12

您是否知道創建web服務客戶端服務實例的成本如何?Webservice - 客戶端服務實例化

JavaWebService service = new JavaWebService(); 
SomePort port = service.getJavaWebServicePort(); 

在多線程環境(webapp)中重複使用同一端口一次創建服務並不危險?

讀取端口getPort和端口本身不是線程安全的,但也創建每次服務時,如果它是一個代價高昂的操作可能會有問題。

有什麼想法?

感謝

回答

12

在JAX-WS參考實現(Metro)中,創建JavaWebService並不昂貴(在我們生成的客戶端中,我們傾向於發現這需要大約20ms)。

SomePort的第一個創建非常昂貴(對我們來說大約200ms);在同一個JavaWebService實例上對getSomePort()的後續調用要快得多(對我們來說大約爲3ms)。

因此,每次創建JavaWebService需要獲得SomePort的實現都會帶來一定程度的費用。總之,這個問題的答案是「相當昂貴」。

但是,即使SomePort上的方法不是線程安全的,JavaWebService上的方法也是如此。因此,明智的使用模式(至少在Metro-thread-safety由於某種程度上缺乏規範而特定於實現)是重用JavaWebService,因爲您只會招致昂貴的getSomePort()調用一次。

更新

這符合兩個職位由Andreas Leow如是從Oracle德國僱員,由@PapaLazarou在下面的評論中引用的線程,誰寫關於Service對象海報之一,

您可以爲每個WSDL只是一個單一的靜態Service例如:任何單一Service對象是線程安全的,並且可以通過儘可能多的併發線程,只要你喜歡共享。

和有關端口的使用情況,

雖然我幾乎可以100%肯定,CXF的JAX-WS端口是線程安全的,地鐵的Port對象絕對是線程安全的。

+2

你有參考嗎?到目前爲止,我能找到的所有帖子都是返回的端口不是線程安全的,CXF的頁面說「客戶端」(我假設它們是指端口)不是線程安全的。我正在尋求的是一些*官方的聲明,表示Metro服務(而不是端口)是線程安全的,特別是對'getPort'的調用返回單獨的實例。 –

+1

我發現了一些由Metro開發者發佈的帖子,表明這一點,但一直在努力尋找他們。我最近設法查找的唯一帖子是[this](http://metro.1045641.n5.nabble.com/JAX-WS-clients-td5709817.html)。僅供參考,我的獨立併發測試也表明這是事實。 – PapaLazarou

4

如果您使用的JAX-WS,那麼你就不能共享跨線程端口(它們不是線程安全的)。如果您擔心創建端口的開銷(並測量了它並確認它是應用程序中的瓶頸),那麼您可以創建一個連接端口池。

+0

我讀到他們不是線程安全的cxf網站,他們提供了一個線程安全的getPort ...但我使用MEtro堆棧JaxWS.So創建服務可能是一個沉重的操作? (將開始做一些測試,但不想重新發明車輪) – Cris

相關問題