Установка клиентского ReceiveTimeout для службы CXF выше 4 минут

Я создал службу CXF и установил таймауты для 120000ms = 2min для обоих:

requestContext.put("javax.xml.ws.client.receiveTimeout", 120000);
requestContext.put("javax.xml.ws.client.connectionTimeout", 120000);

Он работает нормально, я тестировал его для 20s, 1min, 3min - каждый раз он ждет ответа ровно столько времени.

Однако проблема возникает, когда я хочу установить его на 5min. Сервис ожидает ответа только для ~240800ms = ~4min.

Я звоню в сервис jboss esb. Этот длится максимум 5min. Служба CXF вызывается изнутри простого приложения .jar с моего ПК, поэтому между ними нет других серверов/контейнеров (например, tomcat и т. д.).

Любые идеи, чтобы исправить мои настройки тайм-аута?

Использование Apache CXF 3.0.1

ИЗМЕНИТЬ

То, что я понял теперь, когда я получаю 2 разных сообщения, зависит от моих настроек тайм-аута:

  • Если я установлю его на <=4min (с помощью моего метода или метода @pedrofb), по истечении этого времени я получаю:

    org.apache.cxf.interceptor.Fault: не удалось отправить сообщение. в org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:64) в org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307) в org.apache.cxf.endpoint.ClientImpl .doInvoke(ClientImpl.java:516)

    Вызвано: java.net.SocketTimeoutException: исключение SocketTimeoutException, вызывающее http://esb:8080/MyService/ebws/Category/MyService: истекло время чтения

  • если я установлю его на >4min или 0, я получаю:

    javax.xml.ws.soap.SOAPFaultException: ответ для службы [Category:MyService] не получен, не повторять попытку.

Честно говоря, я довольно смущен тем, что является ожидаемым результатом (думаю, первым)

ИЗМЕНИТЬ 2

Я проверил MyService через SoapUI. Я установил тайм-аут 5min и снимаю с запросом образца.

Опять же, после чуть более 4 минут я получаю:

<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
<env:Header/>
<env:Body>
  <env:Fault>
     <faultcode>env:Server</faultcode>
     <faultstring>No response received for service [Category:MyService], Told not to retry.</faultstring>
  </env:Fault>
</env:Body>
</env:Envelope>

Однако, когда я смотрю в журнал Jboss ESB, у меня нет исключений, нет ошибок, MyService длится еще 1 минуту (около 5 минут) и возвращает нормальный ответ, что подтверждается инструментом аудита (который регистрирует каждый запрос к моему esb - с ответом и время).

Я думаю, что это указывает на то, что @pedrofb упомянул в комментарии. Любые предложения, что это может быть?


person countryroadscat    schedule 08.08.2016    source источник
comment
Может ли сервер ограничить ответ четырьмя минутами?   -  person pedrofb    schedule 08.08.2016
comment
Я проверил это - служба отвечает примерно через 4,5min с нормальным ожидаемым сообщением, тайм-аут сервера установлен на 5 min, что подтверждает, что   -  person countryroadscat    schedule 08.08.2016
comment
Возможно, ваша проблема похожа на эту rayploski.blogspot .com.es/2010/08/ Клиент получает тайм-аут, пока ESB продолжает обработку. В этом случае необходимо настроить org.jboss.soa.esb.ws.timeout в ESB   -  person pedrofb    schedule 08.08.2016
comment
@pedrofb Бинго! Param был установлен ровно 240000. Теперь все работает отлично. Можете ли вы отредактировать свой ответ, чтобы я мог его принять? Кстати, какой метод лучше установить тайм-ауты? Через RequestContext или как вы написали через HttpClientPolicy   -  person countryroadscat    schedule 08.08.2016
comment
Отлично, я рад!. Я предлагаю использовать специальные параметры CXF, потому что в тикете JIRA указано, что параметры RequestContext не стандартизированы и могут измениться   -  person pedrofb    schedule 08.08.2016


Ответы (1)


Возможно, ваша проблема похожа на эту http://rayploski.blogspot.com.es/2010/08/jbossesb-setting-up-long-running.html Клиент получает тайм-аут, пока ESB продолжает обработку. В этом случае необходимо настроить org.jboss.soa.esb.ws.timeout в ESB

Чтобы настроить время ожидания клиента, кажется, что использование параметров requestContext не стандартизировано, см. https://java.net/jira/browse/JAX_WS-1166. Команда CXF предполагает, что они могут измениться

Попробуйте использовать специальные параметры CXF для тайм-аута.

Client client = ClientProxy.getClient(proxy);
HTTPConduit http = (HTTPConduit) client.getConduit();
HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
httpClientPolicy.setConnectionTimeout(0);
httpClientPolicy.setReceiveTimeout(0);
http.setClient(httpClientPolicy);

Полный список параметров находится здесь. 0 означает отсутствие тайм-аута.

person pedrofb    schedule 08.08.2016
comment
Используя этот метод, я установил тайм-аут приема на 300000 мс (5 минут). Прошло 10, а время еще не истекло. Есть идеи? - person lovrodoe; 16.06.2021