SocketTimeoutException上的java jersey重试请求
我有一个Jersey客户端,希望在SocketTimeoutException上的java jersey重试请求,java,jersey,request,jersey-2.0,jersey-client,Java,Jersey,Request,Jersey 2.0,Jersey Client,我有一个Jersey客户端,希望在SocketTimeoutException时实现重试,这是我在服务器日志中看到的错误。下面是代码框架webtarget是一个javax.ws.rs.client.webtarget实例,其url路径和查询参数已经定义。我面临的问题是webtarget.request.get()从不抛出任何SocketTimeoutException,因此我实际上无法捕获此异常。有没有想过如何真正实现重试 int i = 0; Response response; while
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
}
}
}
inti=0;
反应;
while(true){
试一试{
response=webtarget.request().get();
打破
}捕获(SocketTimeoutException e){
如果(i
这毫无意义。服务器抛出SocketTimeoutException
,捕获它,记录它,并向客户端返回一些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
}
}
}
inti=0;
反应;
while(true){
试一试{
response=webtarget.request().get();
打破
}捕获(处理异常e){
if(例如,getCause()instanceof SocketTimeoutException&&i
为什么您认为异常只能在服务器上引发?您不想增加请求的客户端超时以避免套接字超时异常本身。