2014-08-30 122 views
0

我正在使用以下方法來創建Web服務客戶端。我可能想知道是否在創建如下的存根實例後建立了客戶端和服務器之間的連接。 否則客戶端和服務器之間的連接調用遠程方法調用後建立如stub.xxxmethod()myervicePort.xxxMetho()Webservice客戶端創建方法

RPC/Encoded 
stub = new MyWsRPCPortStub(new URL(), new MyWsRPCLocator()); 
stub.setTimeout(pdbTimeout); 

Document/Literal 
MyServicePort myervicePort = service.getMyServicePort(); 

學習上的問題,我要決定何時存根實例將被創建後?我的意思是將有兩種方式:

1在應用程序中創建只有一個存根實例,我的意思是我會用單例模式

2 - 每次調用一個方法調用之前創建存根實例

什麼如果我只使用一個存根實例與多線程appiication,同時每個線程開放區別插座在調用stub.xxMethod()

同時 T1-> stub.xxMethod() T2->存根。 xxMethod() T3-> stub.xxMethod()

回答

1

首先,您提到在客戶端使用Web服務的許可不取決於Web服務風格是RPC還是文檔文字。兩種風格的客戶端都是一樣的。這些樣式僅僅決定了如何在客戶端和服務器之間交換SOAP消息的結構。開始的帖子: - here

使用通過HTTP運行的SOAP協議在客戶端和服務器之間發送消息。因此,客戶端和服務器之間的通信應該主要看作是一個普通的HTTP請求/響應模型,而不是在何時以及如何建立和維護它們之間的連接,這是底層TCP協議的工作;並且Web服務客戶端和底層操作系統中的API爲我們完全抽象出這些細節。

但是,如果您想知道Web服務客戶端何時發出HTTP請求,您可以使用任何數據包捕獲工具(例如「wireshark」)來跟蹤它。通常,如果您只有一種方法的Web服務,當您使用Service service = Service.create(url, qname) api和YourWSInterface.xxxmethod()上的HTTP POST時,通常會收到HTTP GET請求。

關於何時創建存根;在多線程環境中;如果您打算在發送到Web服務之前使用客戶端存根上的BindingProvider來設置數據(而不僅僅是隻讀的調用)是;您需要在客戶端代碼中使用一些syhcnronization(使用單個實例)或創建一個客戶端代理池(多個池實例);取決於您的應用程序的要求。

我希望我已經回答了這個問題。

+0

後兩句對我來說已經夠用了。 TNKS。 – 2014-08-31 18:38:39

+0

非常感謝SO,如果它有幫助upvote對我來說! – Abhin 2014-09-01 06:05:34

+0

當多個線程使用相同的存根實例時,每個線程都可以打開不同的連接,請查看我上面更新的問題 – 2014-09-01 12:08:57