Сведения о соединении и таймаутах в клиенте веб-сервиса 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.
когда эти тайм-ауты превышены, вы получите тайм-аут или исключение соединения, и вы можете поместить встречный код, чтобы отслеживать, сколько вы получите.