簡體   English   中英

當WSDL太大時,JAX-WS客戶端掛起30秒

[英]JAX-WS client side is hanging for 30 secs when WSDL is too large

我是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變得太大。 我可以從網絡瀏覽器查看大小,例如,使用上面的兩個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秒鍾。 所以似乎有一個計數器懸掛在某個地方。

另一件事:這個問題只發生在我使用localhost連接時。 如果我嘗試使用另一台計算機的differenc客戶端,並使用內部IP地址,則沒有阻塞。 當我嘗試使用TCPMon並重定向端口時也是如此。

我希望我足夠具體。 任何幫助將不勝感激,我幾天堅持這個問題。 提前致謝!

今天你很幸運! 有兩種選擇:

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

    將WSDL文檔文件和schemma文件的副本保存到項目中。

     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); 

也可以看看:

暫無
暫無

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

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