Сведения о соединении и время ожидания в клиенте веб-службы Java - PullRequest
10 голосов
/ 10 июня 2010

Мне нужно реализовать клиент веб-сервиса для данного файла WSDL. Я использовал инструмент wsimport SDK для создания классов 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. * Аннотации, означающие, что я не могу видеть / изменять / проверять код, который фактически выполняется.

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

1 Ответ

14 голосов
/ 25 июня 2010

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


    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);

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

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

...