Я должен реализовать клиент веб-сервиса в данный файл WSDL. Я использовал 'wsimport' инструмент SDK для создания классов Java из WSDL, а также класса что перенос единственный метод веб-сервиса (enhanceAddress(auth, param, address)
) в простой метод Java.Пока все хорошо. Веб-сервис является функциональными и возвращающимися результатами correcty. Код похож на это:
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-stuff и реализовать мой собственный клиент мыла?
для установки тайм-аута чтения и таймаутов подключения вы можете настроить параметры привязки при настройке экземпляров службы и порта:
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.
когда эти тайм-ауты превышены, вы получите исключение тайм-аута или исключение соединения, и вы можете ввести код счетчика, чтобы отслеживать, сколько вы получаете.