Сведения о подключении и тайм-ауты в клиенте веб-службы Java

Мне нужно реализовать клиент веб-сервиса для данного файла WSDL. Я использовал инструмент SDK wsimport для создания классов Java из WSDL, а также класса, который превращает единственный метод веб-службы (enhanceAddress(auth, param, address)) в простой метод Java. Все идет нормально. Веб-сервис работает и возвращает правильные результаты. Код выглядит так:

try {
  EnhancedAddressList uniservResponse = getWebservicePort().enhanceAddress(m_auth, m_param, uniservAddress);
  //Where the Port^ is the HTTP Soap 1.2 Endpoint
}catch (Throwable e) {
  throw new AddressValidationException("Error during uniserv webservice request.", e);
}

Проблема сейчас: мне нужно получить информацию о соединении и любых ошибках, которые могут возникнуть, чтобы заполнить различные значения JMX (такие как COUNT_READ_TIMEOUT, COUNT_CONNECT_TIMEOUT, ...) К сожалению, метод официально не генерирует никаких исключений, поэтому по порядку чтобы получить подробную информацию об исключении ConnectException, мне нужно использовать getCause() для ClientTransportException, которое будет выброшено.

Еще хуже: я попытался проверить значение таймаута чтения, но его нет. Я изменил расположение службы в файле wsdl, чтобы отправить запрос в скрипт php, который просто ждет вечно и не возвращается. Угадайте, что: клиент веб-службы не тайм-аут, но тоже ждет вечно (я убил приложение после 30+ минут ожидания). Это не вариант для моего приложения, так как в конечном итоге у меня заканчиваются TCP-соединения, если некоторые из них «застревают».

Метод enhanceAddress(auth, param, address) не реализован, но аннотирован javax.jws. * Annotations, что означает, что я не могу видеть / изменять / проверять код, который фактически выполняется.

Есть ли у меня другой вариант, кроме как выбросить весь wsimport / javax.jsw-stuff и реализовать свой собственный мыльный клиент?


person f1sh    schedule 10.06.2010    source источник


Ответы (1)


для настройки таймаута чтения и таймаутов подключения вы можете настроить параметры привязки при настройке экземпляров службы и порта:


    Service = new Service();

    Port = Service.getPort();

    ((BindingProvider) Port).getRequestContext().put(
            BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
            "http://localhost:8080/service");
    ((BindingProvider) Port).getRequestContext().put(
            BindingProviderProperties.CONNECT_TIMEOUT,
            30);
    ((BindingProvider) Port).getRequestContext().put(
            BindingProviderProperties.REQUEST_TIMEOUT,
            30);

теперь всякий раз, когда вы выполняете услугу через «Порт», вы будете получать таймауты ответа и / или таймауты соединения, если серверная часть медленно отвечает. значения соответствуют значениям тайм-аута класса Socket.

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

person Helter Scelter    schedule 25.06.2010
comment
Поскольку 2 недели назад у меня возникла проблема, я написал своего собственного клиента. Несмотря на это, я протестировал ваш подход, и он работает! Тогда я нашел похожий фрагмент кода, но каким-то образом он дал мне ClassCastException, когда я попытался выполнить приведение к BindingProvider. - person f1sh; 29.06.2010
comment
У меня аналогичная проблема, НО тайм-аут происходит, когда я получаю порт, как мне это решить ?? - person maugch; 04.08.2016