Сведения о соединении и таймаутах в клиенте веб-сервиса java

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

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 script, который просто ждет навсегда и не вернется. Угадайте, что: клиент веб-службы не время, но ждет и навсегда (я убил приложение после 30 + минут ожидания). Это не вариант для моего приложения, поскольку в конечном итоге у меня заканчиваются tcp-соединения, если некоторые из них "застревают".

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

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

Ответ 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.

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