Web Services SOAP Web服务调用上的线程阻塞

ep6jt1vc  于 2022-11-15  发布在  其他
关注(0)|答案(1)|浏览(311)

我在Tomcat容器中有一个阻塞的线程,我希望找到原因以避免此问题。
使用jstack时,我发现它在SOAP Web服务调用后卡住:

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)

配置中缺少哪个超时?我使用的是标准选项。

0g0grzrc

0g0grzrc1#

您的客户端尝试从远程URL下载SOAP服务的WDSL文件。默认情况下,HttpURLConnection具有无限的套接字读取超时和无限的连接超时。在您的情况下,在从服务器阅读时,连接似乎被卡住了。由于读取超时是无限的,您将永远被卡住,或者至少在连接被重置(例如,被路由器或服务器重置)之前被卡住。
正如其中一条注解中提到的,可以通过系统属性sun.net.client.defaultReadTimeoutsun.net.client.defaultConnectTimeout配置默认超时您也可以在运行时设置这些属性,但是您必须在读取属性之前完成此操作。不幸的是,这些属性只在加载内部NetworkClient类时读取一次,我还没有尝试过,但是您不太可能在Tomcat容器中设置这些属性,如果您有机会更改Tomcat的启动脚本,我强烈建议您设置显式超时(特别是在生产安装的情况下)。
设置显式超时通常是一个好方法。但是超时只能解决描述的症状,而不能解决实际问题:SOAP客户端依赖于从远程位置成功下载WSDL文件。您可以从本地资源加载WSDL文件,而不是从远程位置下载。有两种可能的方法可以实现此目的:

**A)**如果您应该可以存取(产生的)客户端程式码,您可以将WSDL位置的远端URL取代为类别路径上资源档的URL。请参阅this answer以取得范例。
**B)**如果无法手动调整客户端代码,您可以使用目录文件,如本文所述。

相关问题