2017-02-09 183 views
0

我需要與某些Web服務進行通信。我從https://cxf.apache.org/download.html下載的Apache CXF和生成的Java類與命令異常java.net.SocketTimeoutException:讀取超時

wsdl2java.bat -encoding UTF-8 <url> 

但是,當我試圖約30秒後運行一個長期的請求,我得到異常:

Caused by: javax.xml.ws.soap.SOAPFaultException: java.net.SocketTimeoutException: Read timed out 
    at org.apache.axis2.jaxws.marshaller.impl.alt.MethodMarshallerUtils.createSystemException(MethodMarshallerUtils.java:1326) 
    at org.apache.axis2.jaxws.marshaller.impl.alt.MethodMarshallerUtils.demarshalFaultResponse(MethodMarshallerUtils.java:1052) 
    at org.apache.axis2.jaxws.marshaller.impl.alt.DocLitBareMethodMarshaller.demarshalFaultResponse(DocLitBareMethodMarshaller.java:415) 
    at org.apache.axis2.jaxws.client.proxy.JAXWSProxyHandler.getFaultResponse(JAXWSProxyHandler.java:580) 
    at org.apache.axis2.jaxws.client.proxy.JAXWSProxyHandler.createResponse(JAXWSProxyHandler.java:523) 
    at org.apache.axis2.jaxws.client.proxy.JAXWSProxyHandler.invokeSEIMethod(JAXWSProxyHandler.java:389) 
    at org.apache.axis2.jaxws.client.proxy.JAXWSProxyHandler.invoke(JAXWSProxyHandler.java:174) 
    at com.sun.proxy.$Proxy718.loadLoanHistorySynch(Unknown Source) 
    ... 55 more 
Caused by: java.net.SocketTimeoutException: Read timed out 
    at java.net.SocketInputStream.socketRead0(Native Method) 
    at java.net.SocketInputStream.socketRead(SocketInputStream.java:116) 
    at java.net.SocketInputStream.read(SocketInputStream.java:170) 
    at java.net.SocketInputStream.read(SocketInputStream.java:141) 
    at java.io.BufferedInputStream.fill(BufferedInputStream.java:246) 
    at java.io.BufferedInputStream.read(BufferedInputStream.java:265) 
    at org.apache.commons.httpclient.HttpParser.readRawLine(HttpParser.java:88) 
    at org.apache.commons.httpclient.HttpParser.readLine(HttpParser.java:124) 
    at org.apache.commons.httpclient.HttpParser.readLine(HttpParser.java:105) 
    at org.apache.commons.httpclient.HttpConnection.readLine(HttpConnection.java:1116) 
    at org.apache.commons.httpclient.MultiThreadedHttpConnectionManager$HttpConnectionAdapter.readLine(MultiThreadedHttpConnectionManager.java:1413) 
    at org.apache.commons.httpclient.HttpMethodBase.readStatusLine(HttpMethodBase.java:1973) 
    at org.apache.commons.httpclient.HttpMethodBase.readResponse(HttpMethodBase.java:1735) 
    at org.apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.java:1098) 
    at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:398) 
    at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:171) 
    at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397) 
    at org.apache.axis2.transport.http.AbstractHTTPSender.executeMethod(AbstractHTTPSender.java:621) 
    at org.apache.axis2.transport.http.HTTPSender.sendViaPost(HTTPSender.java:193) 
    at org.apache.axis2.transport.http.HTTPSender.send(HTTPSender.java:75) 
    at org.apache.axis2.transport.http.CommonsHTTPTransportSender.writeMessageWithCommons(CommonsHTTPTransportSender.java:404) 
    at org.apache.axis2.transport.http.CommonsHTTPTransportSender.invoke(CommonsHTTPTransportSender.java:231) 
    at org.apache.axis2.engine.AxisEngine.send(AxisEngine.java:443) 
    at org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.java:406) 
    at org.apache.axis2.description.OutInAxisOperationClient.executeImpl(OutInAxisOperation.java:229) 
    at org.apache.axis2.client.OperationClient.execute(OperationClient.java:165) 
    at org.apache.axis2.jaxws.core.controller.impl.AxisInvocationController.execute(AxisInvocationController.java:578) 
    at org.apache.axis2.jaxws.core.controller.impl.AxisInvocationController.doInvoke(AxisInvocationController.java:127) 
    at org.apache.axis2.jaxws.core.controller.impl.InvocationControllerImpl.invoke(InvocationControllerImpl.java:93) 
    at org.apache.axis2.jaxws.client.proxy.JAXWSProxyHandler.invokeSEIMethod(JAXWSProxyHandler.java:376) 
    ... 67 more 

我試着不同的參數增加超時,但沒有幫助:

 int timeout = 60 * 1000; 

    ((BindingProvider)client).getRequestContext().put("javax.xml.ws.client.connectionTimeout", timeout); 
    ((BindingProvider)client).getRequestContext().put("javax.xml.ws.client.receiveTimeout", timeout); 

    ((BindingProvider)client).getRequestContext().put("com.sun.xml.internal.ws.request.timeout", timeout); 
    ((BindingProvider)client).getRequestContext().put("com.sun.xml.internal.ws.connect.timeout", timeout); 

    ((BindingProvider)client).getRequestContext().put("com.sun.xml.ws.request.timeout", timeout); 
    ((BindingProvider)client).getRequestContext().put("com.sun.xml.ws.connect.timeout", timeout); 

    ((BindingProvider)client).getRequestContext().put("timeout", timeout); 

如何增加請求超時?

+0

您已經使用CXF生成類,但是您正在使用Axis2執行代碼。在處理超時之前,您可能需要解決這個問題 – pedrofb

回答

-1

超時的單位是毫秒這樣:

60 * 1000 = 60000; 

這基本上是60秒後,我想這樣的下方,它爲我工作。

HashMap<String, java.lang.Object> properties = new HashMap<>(); 
      properties.put(HTTPConstants.HTTP_PROTOCOL_VERSION, 
        HTTPConstants.HEADER_PROTOCOL_10); 
      properties.put(HTTPConstants.SO_TIMEOUT, new java.lang.Integer(
        360000)); 
      ServiceStub._getServiceClient().getOptions() 
        .setProperties(properties); 
+0

錯誤,不,60 * 1000是60,000,它是* 60 *秒。 – EJP

+0

哎呦編輯。 – developer

+0

所以現在你還沒有回答這個問題。 – EJP

相關問題