异常java.net.SocketTimeoutException:读取超时

时间:2017-02-09 15:03:20

标签: java cxf axis2

我需要与某些Web服务进行通信。我从https://cxf.apache.org/download.html下载了Apache CXF,并使用命令

生成了Java类
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);

如何增加请求超时?

1 个答案:

答案 0 :(得分:-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);