Бросить исключение тайм-аута из SOAPException

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

URL endpoint = new URL(null,
    urlStr,
    new URLStreamHandler() {
      // The url is the parent of this stream handler, so must create clone
      protected URLConnection openConnection(URL url) throws IOException {
        URL cloneURL = new URL(url.toString());
        HttpURLConnection cloneURLConnection = (HttpURLConnection) cloneURL.openConnection();
        // TimeOut settings
        cloneURLConnection.setConnectTimeout(10000);
        cloneURLConnection.setReadTimeout(10000);
        return cloneURLConnection;
      }
    });

try {
  response = connection.call(request, endpoint);
} catch (SOAPException soapEx) {
  if(soapEx.getMessage().contains("Message send failed")) {
    throw new TimeoutExpirationException();
  } else {
    throw soapEx;
  }
}

2 ответа

Решение

После нескольких часов тестирования я нашел правильный способ отличить SOAPException от исключений, связанных с Timeout. Таким образом, решение состоит в том, чтобы взять родительское поле причины исключения и проверить, является ли это экземпляром SocketTimeoutException,

try {
  response = connection.call(request, endpoint);
} catch (SOAPException soapEx) {
  if(soapEx.getCause().getCause() instanceof SocketTimeoutException) {
    throw new TimeoutExpirationException(); //custom exception
  } else {
    throw soapEx;
  }
}

Следующие строки взяты из открытого исходного кода JDK call метод. В коде они только ловят Exception (также с цепочкой? комментарий). Я не думаю, что есть другой путь, если Oracle jdk не справится с этим иначе.
Вы все еще можете попробовать что-то вроде if(soapEx.getCause() instanceof SomeTimeoutException) (не уверен, будет ли это работать)

            try {
                SOAPMessage response = post(message, (URL)endPoint);
                return response;
            } catch (Exception ex) {
                // TBD -- chaining?
                throw new SOAPExceptionImpl(ex);
            } 

Если вы хотите проверить исходный код HttpSoapConnection

Другие вопросы по тегам