gpt4 book ai didi

java - 当 WSDL 太大时,JAX-WS 客户端挂起 30 秒

转载 作者:搜寻专家 更新时间:2023-11-01 03:06:58 24 4
gpt4 key购买 nike

我对 JAX-WS Web 服务和 Apache CXF 有点陌生。我们正在开发一个简单的客户端-服务器系统,它们之间的通信是通过 JAX-WS 网络服务协议(protocol)进行的。在服务器端,我们使用 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 变得太大。我可以通过网络浏览器查看大小,例如,使用上面的两个 GET 链接。当第二次 GET 请求的响应达到 100K 大小时(浏览器中的 XML 响应),因为在 web 服务接口(interface)中声明了太多的函数,然后会发生以下情况:客户端在第二次 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 时也不会重定向端口。

我希望我足够具体。任何帮助将不胜感激,我在这个问题上停留了好几天。提前致谢!

最佳答案

今天你很幸运!有两种选择:

  1. 在本地使用 WSDL 文档文件

    将 WSDL 文档文件和架构文件的副本保存到您的项目中。

    ClassLoader classloader = Thread.currentThread().getContextClassLoader();
    URL wsdlLocation = classloader.getResource("MyHelloService.wsdl");
    QName serviceName= new QName("http://test.com/", "MyHelloService");

    MyHelloService service = new MyHelloService(wsdlLocation, serviceName);
    service.sayHello("Test");
  2. 没有 WSDL 文档文件

    QName qname = new QName("http://thenamespace", "FooService");
    FooService service = new FooService(null, qname); // null for ignore WSDL
    Foo port = service.getFooPort();
    BindingProvider bindingProvider = (BindingProvider) port;
    bindingProvider.getRequestContext()
    .put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
    "http://foo.com/soap/fooBean");

    // Use the service
    Object obj = port.doSomething(param);

另见:

关于java - 当 WSDL 太大时,JAX-WS 客户端挂起 30 秒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18920115/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com