barbitoff programmer`s blog

Здесь я публикую заметки из программерской жизни: грабли, на которые мне случилось наступить, проблемы, для которых было найдено элегантное (или не очень) решение, а также все, с чем мне пришлось столкнуться и чем хотелось бы поделиться =)
PS Если хотите меня поблагодарить - на странице есть 3 места, чтобы это сделать =)

среда, 7 марта 2012 г.

Настройка таймаута запроса к SOAP-веб-сервису в JAX-WS

Задача:

Явно задать таймаут запроса к SOAP-веб-сервису, клиент которого создан с помощью wsimport.

Решение:

Как ни странно, найти решение оказалось непросто. Во-первых, решение зависит от сервера приложений, т.е. конкретной реализации JAX-WS, т.к., насколько я понял, спецификация JAX-WS такого функционала не предусматривает.
В любом случае проблема решается установкой неких свойств в контексте запроса следующим образом:
<ServiceName> serv = new <ServiceName>();
<PortTypeName> port = confServ.get<PortName>();
((BindingProvider) port).getRequestContext().put(<ParameterName>, iTimeoutValue);
, где ServiceName - имя SOAP-сервиса, PortName - имя порта, PortTypeName - имя типа порта (эти классы были сгенерированы wsimport`ом), iTimeoutValue - величина таймаута, которую хотим установить, ParameterName - имя параметра, зависящее от реализации JAX-WS. 
Для Tomcat 6 достаточно установки свойства JAXWSProperties.REQUEST_TIMEOUT, однако видел также рекомендации по установке свойств JAXWSProperties.CONNECT_TIMEOUT и BindingProviderProperties.REQUEST_TIMEOUT, так что можно на всякий случай устанавливать все 3. Для JBoss используется свойство org.jboss.ws.core.StubExt.StubExt.PROPERTY_CLIENT_TIMEOUT (http://stackoverflow.com/questions/2592303/how-do-i-set-the-jax-ws-client-request-timeout-programatically-on-jboss).
Если при сборке проекта возникают ошибки типа "package com.sun.xml.internal.ws.client does not exist", решение описано здесь: http://barbitoff.blogspot.com/2012/03/comsunxmlinternalws.html.

Комментариев нет:

Отправить комментарий