CXF java.net.ConnectException: время ожидания соединения истекло

У меня истекает время ожидания соединения, когда я пытаюсь вызвать из клиента WS метод из развернутой мной веб-службы CXF. Оба используют настраиваемые перехватчики, а служба перегружена из-за многочисленных вызовов.

Caused by: java.net.ConnectException: ConnectException invoking http://xxx.xx.xx.xx:12005/myservice/repository?wsdl: Connection timed out
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.mapException(HTTPConduit.java:1338)
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1322)
    at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56)
    at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:622)
    at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62)
    ... 36 more

Я пробовал несколько решений, чтобы отключить тайм-аут или увеличить его, но все потерпело неудачу.

Сначала я попытался создать файл конфигурации CXF, подобный следующему:

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:http-conf="http://cxf.apache.org/transports/http/configuration"
    xsi:schemaLocation="http://cxf.apache.org/transports/http/configuration
           http://cxf.apache.org/schemas/configuration/http-conf.xsd
           http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd">

    <http-conf:conduit name="*.http-conduit">
        <http-conf:client CacheControl="no-cache"
            ConnectionTimeout="0" ReceiveTimeout="0" AllowChunking="false" />
    </http-conf:conduit>
</beans>

Затем я заставил свое приложение загрузить его, используя системное свойство Java -Dcxf.config.file=/home/test/resources/cxf.xml.

В журналах я вижу, что конфигурация прочитана и, следовательно, вероятно, применена

ИНФОРМАЦИЯ: загружен файл конфигурации /home/test/resources/cxf.xml.

К сожалению, время ожидания соединения все еще происходит.

Второе решение, которое я попробовал, состоит в программной установке политики на всех клиентах с помощью следующего фрагмента кода:

public static void setHTTPPolicy(Client client) {
    HTTPConduit http = (HTTPConduit) client.getConduit();

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

    http.setClient(httpClientPolicy);
}

но опять происходит тайм-аут соединения.

Я что-то пропустил? Есть ли какие-то другие тайм-ауты для настройки? любая помощь приветствуется.


person Laurent    schedule 22.06.2013    source источник
comment
Тайм-аут подключения обычно является признаком другой проблемы, а не причиной сам по себе. Вы говорите, что для некоторых вызовов службы соединение не прерывается по тайм-ауту?   -  person kolossus    schedule 22.06.2013
comment
Да, некоторые вызовы работают хорошо. Мой сценарий состоит из передачи больших вложений, что объясняет тайм-аут. Проблема, с которой я столкнулся, связана с настройкой тайм-аутов на стороне клиента и сервера.   -  person Laurent    schedule 22.06.2013
comment
Ах. Тогда я бы рекомендовал пул потоков. Найдите мой ответ ниже в ближайшее время.   -  person kolossus    schedule 22.06.2013


Ответы (1)


CXF позволяет настроить объединение потоков для конечной точки вашего веб-сервиса. Таким образом, вы можете справиться с тайм-аутами, возникающими в результате нехватки ресурсов для обработки запросов. Ниже приведен пример конфигурации с использованием параметра <jaxws:endpoint/> в cxf:

<jaxws:endpoint id="serviceBean"  implementor="#referenceToServiceBeanDefinition" address="/MyEndpointAddress">
        <jaxws:executor>
             <bean id="threadPool" class="java.util.concurrent.ThreadPoolExecutor">  
                 <!-- Minimum number of waiting threads in the pool -->
                 <constructor-arg index="0" value="2"/>
                 <!-- Maximum number of working threads in the pool -->
                 <constructor-arg index="1" value="5"/>
                 <!-- Maximum wait time for a thread to complete execution -->
                 <constructor-arg index="2" value="400000"/>
                 <!-- Unit of wait time -->
                 <constructor-arg index="3" value="#{T(java.util.concurrent.TimeUnit).MILLISECONDS}"/>
                 <!-- Storage data structure for waiting thread tasks -->
                 <constructor-arg index="4" ref="taskQueue"/>
             </bean>
         </jaxws:executor>
    </jaxws:endpoint>

    <!-- Basic data structure to temporarily hold waiting tasks-->
    <bean id="taskQueue" class="java.util.concurrent.LinkedBlockingQueue"/>
person kolossus    schedule 22.06.2013