2011-03-11 55 views
6

我面臨的WebService的問題,具體爲:的WebService/java.net.SocketTimeoutException:讀超時

Caused by: org.apache.cxf.interceptor.Fault: Could not send Message. 
at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:64) 
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:220) 
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:276) 
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:222) 
at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:73) 
at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:171) 
... 26 more 
Caused by: java.net.SocketTimeoutException: Read timed out 
at java.net.SocketInputStream.socketRead0(Native Method) 
at java.net.SocketInputStream.read(SocketInputStream.java:129) 
at java.io.BufferedInputStream.fill(BufferedInputStream.java:218) 
at java.io.BufferedInputStream.read1(BufferedInputStream.java:258) 
at java.io.BufferedInputStream.read(BufferedInputStream.java:317) 
at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:687) 
at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:632) 
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1000) 
at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:373) 
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:1900) 
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1828) 
at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:66) 
at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:590) 
at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62) 
... 31 more 

當我嘗試發送到目標服務的請求時,它需要30-60秒並且比上述例外情況被拋出。我正在使用Tomcat 5,並且我想問問有沒有增加超時值的方法? 另外,我想訪問的WSDL和WebService正在運行並可用。

我非常感謝所有幫助在此,

親切的問候, P.

回答

-1

右鍵你做之前,你的Web服務調用(即port.someAction(....)),您需要將請求超時設置爲一個較大的量在RequestContext的:

// Set request context property. 
    java.util.Map<String, Object> requestContext = 
     ((javax.xml.ws.BindingProvider) port).getRequestContext(); 

    requestContext.put("com.sun.xml.ws.request.timeout", new Long(600000)); 

或者,如果您使用的JAX-WS:

// Set request context property. 
    java.util.Map<String, Object> requestContext = 
     ((javax.xml.ws.BindingProvider) port).getRequestContext(); 

    requestContext.put("com.sun.xml.internal.ws.request.timeout", new Long(600000)); 

這裏有一個帖子說真的幫了我:

How do I set the timeout for a JAX-WS webservice client?

+0

我認爲放置上下文變量並不是一個壞主意,但是你無法確定每個JRE上都有'com.sun.xml.internal。*'包可用。 – froginvasion 2016-01-20 14:13:56

2

我有點晚了這個黨,但我想其他的解決方案,他們沒有工作,但this做到了。

MyWebService service = new MyWebService(); 
MyWebServicePortType client = service.MyWebServicePort(); 

Client cl = ClientProxy.getClient(client); 

HTTPConduit http = (HTTPConduit) cl.getConduit(); 

HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy(); 
httpClientPolicy.setConnectionTimeout(0); 
httpClientPolicy.setReceiveTimeout(0); 

http.setClient(httpClientPolicy); 

client.doSomething(...);