簡體   English   中英

在 SOAP 網絡服務調用上卡住線程

[英]Stucked thread on SOAP webservice call

我在 Tomcat 容器中有一個線程卡住,我想找到原因來避免這個問題。

使用jstack我發現它在 SOAP 網絡服務調用后卡住了:

pool-2-thread-1" #27 prio=5 os_prio=0 tid=0x00007fd2315ce800 nid=0x39 runnable [0x00007fd2415d2000]
   java.lang.Thread.State: RUNNABLE
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
    at java.net.SocketInputStream.read(SocketInputStream.java:171)
    at java.net.SocketInputStream.read(SocketInputStream.java:141)
    at java.io.BufferedInputStream.fill(BufferedInputStream.java:246)
    at java.io.BufferedInputStream.read1(BufferedInputStream.java:286)
    at java.io.BufferedInputStream.read(BufferedInputStream.java:345)
    - locked <0x0000000087eb10e0> (a java.io.BufferedInputStream)
    at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:735)
    at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:678)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1587)
    - locked <0x0000000087eb1138> (a sun.net.www.protocol.http.HttpURLConnection)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1492)
    - locked <0x0000000087eb1138> (a sun.net.www.protocol.http.HttpURLConnection)
    at java.net.URL.openStream(URL.java:1045)
    at com.sun.xml.ws.wsdl.parser.RuntimeWSDLParser.createReader(RuntimeWSDLParser.java:999)
    at com.sun.xml.ws.wsdl.parser.RuntimeWSDLParser.resolveWSDL(RuntimeWSDLParser.java:400)
    at com.sun.xml.ws.wsdl.parser.RuntimeWSDLParser.parse(RuntimeWSDLParser.java:231)
    at com.sun.xml.ws.wsdl.parser.RuntimeWSDLParser.parse(RuntimeWSDLParser.java:209)
    at com.sun.xml.ws.wsdl.parser.RuntimeWSDLParser.parse(RuntimeWSDLParser.java:178)
    at com.sun.xml.ws.client.WSServiceDelegate.parseWSDL(WSServiceDelegate.java:364)
    at com.sun.xml.ws.client.WSServiceDelegate.<init>(WSServiceDelegate.java:322)
    at com.sun.xml.ws.client.WSServiceDelegate.<init>(WSServiceDelegate.java:231)
    at com.sun.xml.ws.client.WSServiceDelegate.<init>(WSServiceDelegate.java:212)
    at com.sun.xml.ws.client.WSServiceDelegate.<init>(WSServiceDelegate.java:208)
    at com.sun.xml.ws.spi.ProviderImpl.createServiceDelegate(ProviderImpl.java:119)
    at javax.xml.ws.Service.<init>(Service.java:77)

配置中缺少哪個超時? 我正在使用標准選項。

您的客戶端嘗試從遠程 URL 下載 SOAP 服務的 WDSL 文件。默認情況下, HttpURLConnection具有無限套接字讀取超時和無限連接超時 在您的情況下,連接似乎在從服務器讀取時卡住了。 由於讀取超時是無限的,您將永遠卡住或至少直到連接被重置(例如通過路由器或服務器)。

正如其中一條評論中已經提到的,可以通過系統屬性sun.net.client.defaultReadTimeoutsun.net.client.defaultConnectTimeout (如此記錄)配置默認超時。 您也可以在運行時設置這些屬性,但您必須在讀取屬性之前執行此操作。 不幸的是,當加載內部NetworkClient class 時,這些屬性只被讀取一次。 我還沒有嘗試過,但在加載 class 之前,您不太可能能夠在 Tomcat 容器中設置屬性。 如果您有機會更改 Tomcat 的啟動腳本,我強烈建議您設置明確的超時(尤其是在生產設置的情況下)。

設置顯式超時通常是一個好方法。 但是超時只能解決所描述的症狀,而不能解決您的實際問題:您的 SOAP 客戶端依賴於從遠程位置成功下載 WSDL 文件。 您可以從本地資源加載它,而不是從遠程位置下載 WSDL 文件。 有兩種可能的方法可以做到這一點:

A)如果您應該有權訪問(生成的)客戶端代碼,您可以將 WSDL 位置的遠程 URL 替換為類路徑上資源文件的 URL。 有關示例,請參見此答案

B)如果無法手動調整客戶端代碼,您可以使用目錄文件,如此所述。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM