java 关于 SocketTimeoutException 的球衣重试请求
java jersey retry request on SocketTimeoutException
我有一个 Jersey 客户端,想在 SocketTimeoutException
上实施重试,这是我在服务器日志中看到的错误。代码框架如下。 webtarget
是一个 javax.ws.rs.client.WebTarget
实例,其中已经定义了 url 路径和查询参数。我面临的问题是 webtarget.request.get()
从不抛出任何 SocketTimeoutException,所以我实际上无法捕获此异常。有什么想法可以实际实现重试吗?
int i = 0;
Response response;
while (true) {
try {
response = webtarget.request().get();
break;
} catch (SocketTimeoutException e){
if (i < retryNumber) {
i++;
} else {
// throws some exception
}
}
}
这没有意义。服务器抛出 SocketTimeoutException
并捕获它并记录它,并向客户端 returns 一些 HTTP 错误代码。它不能向客户端抛出异常。
您需要观察返回的 HTTP 错误代码,然后在该情况下重试。
我最终找到了解决方案。事实证明 SocketTimeoutException
被映射到 ProcessingException
,实际上是由 Jersey 客户端抛出的。所以下面的代码有效
int i = 0;
Response response;
while (true) {
try {
response = webtarget.request().get();
break;
} catch (ProcessingException e){
if (e.getCause() instanceof SocketTimeoutException && i < retryNumber) {
i++;
} else {
// throws some exception
}
}
}
我有一个 Jersey 客户端,想在 SocketTimeoutException
上实施重试,这是我在服务器日志中看到的错误。代码框架如下。 webtarget
是一个 javax.ws.rs.client.WebTarget
实例,其中已经定义了 url 路径和查询参数。我面临的问题是 webtarget.request.get()
从不抛出任何 SocketTimeoutException,所以我实际上无法捕获此异常。有什么想法可以实际实现重试吗?
int i = 0;
Response response;
while (true) {
try {
response = webtarget.request().get();
break;
} catch (SocketTimeoutException e){
if (i < retryNumber) {
i++;
} else {
// throws some exception
}
}
}
这没有意义。服务器抛出 SocketTimeoutException
并捕获它并记录它,并向客户端 returns 一些 HTTP 错误代码。它不能向客户端抛出异常。
您需要观察返回的 HTTP 错误代码,然后在该情况下重试。
我最终找到了解决方案。事实证明 SocketTimeoutException
被映射到 ProcessingException
,实际上是由 Jersey 客户端抛出的。所以下面的代码有效
int i = 0;
Response response;
while (true) {
try {
response = webtarget.request().get();
break;
} catch (ProcessingException e){
if (e.getCause() instanceof SocketTimeoutException && i < retryNumber) {
i++;
} else {
// throws some exception
}
}
}