Как я устанавливаю тайм-аут для клиента веб-сервиса JAX-WS?

Я использовал JAXWS-RI 2.1 для создания интерфейса для моего веб-сервиса, на основе WSDL. Я не могу взаимодействовать с веб-сервисом никакие проблемы, но не смог указать тайм-аут для того, чтобы отправить запросы к веб-сервису. Если по некоторым причинам это не отвечает, клиент просто, кажется, вращается, это - колеса навсегда.

Поиск вокруг показал, что я должен, вероятно, пытаться сделать что-то вроде этого:

((BindingProvider)myInterface).getRequestContext().put("com.sun.xml.ws.request.timeout", 10000);
((BindingProvider)myInterface).getRequestContext().put("com.sun.xml.ws.connect.timeout", 10000);

Я также обнаружил, что, в зависимости от которой версии JAXWS-RI Вы имеете, Вы, возможно, должны установить эти свойства вместо этого:

((BindingProvider)myInterface).getRequestContext().put("com.sun.xml.internal.ws.request.timeout", 10000);
((BindingProvider)myInterface).getRequestContext().put("com.sun.xml.internal.ws.connect.timeout", 10000);

Проблема, которую я имею, состоит в том, что, независимо от какого из вышеупомянутого корректно, я не знаю, где я могу сделать это. Все, что я имею, является a Service подкласс, который реализует автоматически сгенерированный интерфейс к веб-сервису и в точке, что это получает instanciated, если WSDL является небыстро реагирующим затем, уже слишком поздно для установки свойств:

MyWebServiceSoap soap;
MyWebService service = new MyWebService("http://www.google.com");
soap = service.getMyWebServiceSoap();
soap.sendRequestToMyWebService();

Кто-либо может указать на меня в правильном направлении?!

88
задан Jon Seigel 16 May 2010 в 01:56
поделиться

2 ответа

Не уверен, поможет ли это в вашем контексте ...

Можно ли преобразовать объект мыла как BindingProvider?

MyWebServiceSoap soap;
MyWebService service = new MyWebService("http://www.google.com");
soap = service.getMyWebServiceSoap();
// set timeouts here
((BindingProvider)soap).getRequestContext().put("com.sun.xml.internal.ws.request.timeout", 10000);
    soap.sendRequestToMyWebService();

С другой стороны, если вы если вы хотите установить тайм-аут при инициализации объекта MyWebService, это не поможет.

Это сработало для меня, когда я хотел отключить отдельные вызовы WebService.

3
ответ дан 24 November 2019 в 07:33
поделиться

самый простой способ избежать медленного получения удаленного WSDL при инстанцировании вашего SEI - не получать WSDL из конечной точки удаленного сервиса во время выполнения.

Это означает, что вы должны обновлять свою локальную копию WSDL каждый раз, когда поставщик услуг вносит изменения, но это также означает, что вы должны обновлять свою локальную копию каждый раз, когда поставщик услуг вносит изменения.

Когда я генерирую свои клиентские заглушки, я говорю среде выполнения JAX-WS аннотировать SEI таким образом, чтобы она считывала WSDL из заранее определенного места на classpath. По умолчанию это местоположение относительно местоположения пакета Service SEI


<wsimport
    sourcedestdir="${dao.helter.dir}/build/generated"
    destdir="${dao.helter.dir}/build/bin/generated"
    wsdl="${dao.helter.dir}/src/resources/schema/helter/helterHttpServices.wsdl"
    wsdlLocation="./wsdl/helterHttpServices.wsdl"
    package="com.helter.esp.dao.helter.jaxws"
    >
    <binding dir="${dao.helter.dir}/src/resources/schema/helter" includes="*.xsd"/>
</wsimport>
<copy todir="${dao.helter.dir}/build/bin/generated/com/helter/esp/dao/helter/jaxws/wsdl">
    <fileset dir="${dao.helter.dir}/src/resources/schema/helter" includes="*" />
</copy>

атрибут wsldLocation сообщает SEI, где он может найти WSDL, и копия убеждается, что wsdl (и поддерживающий xsd... и т.д.) находится в правильном месте.

поскольку расположение относительно расположения пакета SEI, мы создаем новый подпакет (каталог) под названием wsdl, и копируем туда все артефакты wsdl.

Все, что вам нужно сделать на этом этапе, это убедиться, что вы включили все *.wsdl, *.xsd в дополнение ко всем *.class при создании jar-файла артефакта client-stub.

(если вам интересно, аннотация @webserviceClient является тем местом, где это расположение wsdl фактически установлено в коде java

@WebServiceClient(name = "httpServices", targetNamespace = "http://www.helter.com/schema/helter/httpServices", wsdlLocation = "./wsdl/helterHttpServices.wsdl")
2
ответ дан 24 November 2019 в 07:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: