Детали соединения и тайм-ауты в клиенте веб-сервиса Java

Я должен реализовать клиент веб-сервиса в данный файл 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 и реализовать мой собственный клиент мыла?

10
задан Catchwa 10 June 2010 в 13:42
поделиться

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.

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

14
ответ дан 3 December 2019 в 23:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: