2014-01-16 69 views
2

我已經使用JAX-WS wsgen工具從wsdl模式實現了SOAP客戶端。
這是在Windows 32位JDK 1.6.0_45做,JAX-WS RI 2.1.6,生成的源版本:2.1當服務器沒有響應時,JAX-WS SOAP Service會凍結


當服務是不響應的,我的代碼試圖調用服務構造函數時只是掛起。

我花了很長時間尋找解決方案。我發現:
1)添加超時系統性能,如:

sun.rmi.transport.connectionTimeout=50 
sun.rmi.transport.tcp.handshakeTimeout=50 
sun.rmi.transport.tcp.responseTimeout=50 
sun.rmi.transport.tcp.readTimeout=50 
sun.net.client.defaultConnectTimeout=50 
sun.net.client.defaultReadTimeout=50 
timeout=50 

2)添加超時屬性BindingProvider的RequestContext的:

port = service.getExampleServicePort(); 
     BindingProvider prov = (BindingProvider) port; 
     prov.getRequestContext().put("com.sun.xml.internal.ws.request.timeout", requestTimeout); 
     prov.getRequestContext().put("com.sun.xml.ws.request.timeout", requestTimeout); 
     prov.getRequestContext().put("com.sun.xml.internal.ws.connect.timeout", connectTimeout); 
     prov.getRequestContext().put("com.sun.xml.ws.connect.timeout", connectTimeout); 

的問題是,該代碼凍結之前,我可以得到一個端口,特別是當我調用生成服務類的構造函數時,它擴展了javax.xml.ws.Service:

service = new ExampleService(url, new QName("http://query.services.example.com/", "ExampleService")); 
//freezes here 

這是導致問題的構造:

/** 
* This class was generated by the JAX-WS RI. 
* JAX-WS RI 2.1.6 in JDK 6 
* Generated source version: 2.1 
* 
*/ 
@WebServiceClient(name = "ExampleService", targetNamespace = "http://query.services.example.com/", wsdlLocation = "http://myservicehost/services/Query.asmx?WSDL") 
public class ExampleService 
    extends Service 
{ 

    public ExampleService(URL wsdlLocation, QName serviceName) { 
     super(wsdlLocation, serviceName); 
    } 

    //.... 
} 

最後,服務的這種方法只是掛

protected Service(java.net.URL wsdlDocumentLocation, QName serviceName) { 
     delegate = Provider.provider().createServiceDelegate(wsdlDocumentLocation, 
       serviceName, 
       this.getClass()); 
    } 

如何防止我的ExampleService凍結時服務沒有響應(不使用其他庫像Apache Axis或JBoss WS)?

謝謝!

回答

2

我相信answer適用於您的問題 - 在本地保存WSLD文檔。

+2

好的,這真的有幫助。事實證明,需要WSDL來實例化服務類。這在[this](http://stackoverflow.com/a/21150088/3198526)中有所描述。但是如果WSDL將被更改並且使用過時的本地副本呢? – Artems

+0

如果有人以向後兼容的方式更改WSLD(說增加可能爲空的新方法或參數) - 這仍然很好。如果服務合同會以不兼容的方式進行更改(這只是草率),那麼無論您是下載WSLD還是將其保存在本地,您的客戶都不會受到影響。 –