java.net.SocketTimeoutException:读取超时WebServiceTemplate.sendAndReceive(WebServiceTemplate.java:561)

时间:2017-11-02 02:48:53

标签: java spring web-services spring-web

我在使用WebserviceTemplate调用SOAP服务时遇到异常。我正在使用代理连接到端点URL。

以下是我的XML配置:

    <bean id="webServiceTemplate" class="org.springframework.ws.client.core.WebServiceTemplate">
    <property name="marshaller" ref="jaxb2Marshaller"></property>
    <property name="unmarshaller" ref="jaxb2Marshaller"></property>
    <property name="defaultUri"><value>${ws.url}</value></property>
    <property name="interceptors">  
        <list>  
            <ref local="wsClientSecurityInterceptor"/>  
        </list>  
    </property>
    <property name="messageSender" ref="messageSender"></property>
    </bean>

    <bean id="messageSender" class="org.springframework.ws.transport.http.CommonsHttpMessageSender">
    <constructor-arg ref="httpClient"></constructor-arg>
    </bean>

    <!-- This is my custom class to set the proxy -->
    <bean id="proxyConfig" class="com.somepackage.client.ProxyConfiguration">
    <property name="proxyHostPlusPort"><value>${proxy.host}:${proxy.port}</value></property>
    </bean>

    <bean id="httpParams" class="org.apache.commons.httpclient.params.HttpClientParams">
    <property name="soTimeout" value="120000" /> 
    </bean>

    <bean id="httpClient" class="org.apache.commons.httpclient.HttpClient">
    <property name="hostConfiguration" ref="proxyConfig" />
    <property name="params" ref="httpParams" />
    </bean>

    <bean id="jaxb2Marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
    <property name="packagesToScan">
        <list><value>com.aaa.wsdl</value></list>
    </property>
    </bean>

    <bean id="wsClientSecurityInterceptor"  
    class="org.springframework.ws.soap.security.wss4j.Wss4jSecurityInterceptor">  
    <property name="securementActions" value="UsernameToken" />  
    <property name="securementUsername"><value>${ws.username}</value></property>  
    <property name="securementPassword"><value>${ws.password}</value></property>
    <property name="securementPasswordType" value="PasswordText" />
    </bean>

有时我在调用webservice时遇到异常:

org.springframework.ws.client.WebServiceIOException: I/O error: Read timed out; nested exception is java.net.SocketTimeoutException: Read timed out
at org.springframework.ws.client.core.WebServiceTemplate.sendAndReceive(WebServiceTemplate.java:561)
at org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:390)
at org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:383)

即使我已经设置了soTimeout,我也遇到了这个问题。我怀疑的是,当代理停机超过2分钟时会出现问题。

有人可以指导我如何摆脱这个问题?单独设置soTimeout就足够了,或者我们需要设置一些更多的参数?

感谢。

1 个答案:

答案 0 :(得分:0)

您无法忽略较低级别(硬件/网络)错误,可以说您可以通过在应用程序中添加一些智能来跟踪它们并做出相应的响应。

例如,通过做一些额外的尝试等。 为了拥有更强大的应用程序。

经过多次尝试,您可以向用户发回一条消息,说明存在网络问题,而且现在无法满足请求并使用记录器进行跟踪。

如果这种情况经常发生,应在下一级采取行动。

使用:

-> try/catch, throw exception
相关问题