我对 JAX-WS Webservices 和 Apache CXF 有点陌生。我们正在开发一个简单的客户端-服务器系统,它们之间的通信是通过 JAX-WS Web 服务协议进行的。在服务器端,我们使用 Apache CXF 实现(因为使用了拦截器),在客户端它是正常的参考实现(jax-ws-rt)。
我的问题如下:当客户端首先创建服务时:
service = Service.create(uri.toURL(), new QName(targetNamespace, serviceName));
然后它通常会向服务器发送 GET 请求,以获取和处理 WSDL。首先是这样的:
GET .../services/ws/mainservice?wsdl
然后紧接着
GET .../services/ws/mainservice?wsdl=mainservice.wsdl
到现在为止还挺好。第三个请求是普通的 HTTP POST 请求,使用 SOAP,调用客户端调用的函数。
一切正常,直到 WSDL 变得太大。我可以从 Web 浏览器中查看大小,例如,使用上面的两个 GET 链接。当第二次 GET 请求的响应达到 100K 大小(浏览器中的 XML 响应)时,由于 Web 服务接口中声明的函数过多,会出现以下情况:客户端在第二次 GET 期间挂起约 30 秒请求,然后一切正常,函数运行。
我调试了,在这种情况下哪个点被阻塞,它在RuntimeWSDLParser.java, createReader() 函数中,当它调用时:
private static XMLStreamReader createReader(URL wsdlLoc, Class<Service> serviceClass) throws IOException, XMLStreamException {
InputStream stream;
try {
stream = wsdlLoc.openStream();
} catch (IOException io) {
}
该文件位于客户端的 jax-ws-rt.jar 中。
奇怪的是(至少对我来说,但我不是很熟悉)如果我用调试器到达这一行并立即跨过,那么它大约是 30 秒的阻塞。如果我等了 25 秒,然后我跨过去,那么只有 5 秒。所以似乎有一个柜台可以挂在某个地方。
另一件事:仅当我使用本地主机连接时才会出现此问题。如果我尝试使用与另一台计算机不同的客户端,并使用内部 IP 地址,则不会阻塞。也不是当我尝试使用 TCPMon 并重定向端口时。
我希望我足够具体。任何帮助将不胜感激,我被这个问题困扰了好几天。提前致谢!