Бросить исключение тайм-аута из 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