Kraft wiederholen, auf bestimmte http-status-code
Umgang mit einer bestimmten website, manchmal bekomme ich eine http-Antwort mit dem status-code 403. Ich wollte für die erneute Ausführung der Anfrage in solchen Fällen (da, in meiner spezifischen situation dieser server wirft eine 403, wenn es tatsächlich überlastet). Ich habe versucht, eine ResponseHandler
zusammen mit einem StandardHttpRequestRetryHandler
, aber es hat nicht funktioniert, wie ich gehofft; ich erwartete, dass das werfen einer Ausnahme in der ResponseHandler
auslösen würde, die den StandardHttpRequestRetryHandler
, aber es scheint nicht der Fall zu sein. Wie Erreiche ich die gewünschte Funktionalität?
Hier ist ein Beispielcode, der veranschaulicht, meine situation:
import java.io.IOException;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.client.methods.RequestBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.client.StandardHttpRequestRetryHandler;
import org.apache.http.protocol.HttpContext;
import org.apache.http.util.EntityUtils;
public class Main {
public static void main(String[] args) throws Exception {
//a response handler that throws an exception if status is not 200
ResponseHandler<String> responseHandler = new ResponseHandler<String> () {
@Override
public String handleResponse(HttpResponse response) throws
ClientProtocolException, IOException
{
System.out.println("-> Handling response");
if (response.getStatusLine().getStatusCode() != 200){
//I expected this to trigger the retryHandler
throw new ClientProtocolException("Status code not supported");
}
return EntityUtils.toString(response.getEntity());
}
};
StandardHttpRequestRetryHandler retryHandler =
new StandardHttpRequestRetryHandler(5, true)
{
@Override
public boolean retryRequest(
final IOException exception,
final int executionCount,
final HttpContext context)
{
System.out.println("-> Retrying request");
return super.retryRequest(exception, executionCount, context);
}
};
//my client with my retry handler
HttpClient client = HttpClients
.custom()
.setRetryHandler(retryHandler)
.build();
//my request
HttpUriRequest request = RequestBuilder
.create("GET")
.setUri("http://httpstat.us/403") //always returns 403
.build();
String contents = client.execute(request, responseHandler);
System.out.println(contents);
}
}
- ich denke du meinst 503 - Service Unavailable
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen Sie es mit einem benutzerdefinierten
ServiceUnavailableRetryStrategy
Können Sie es tun, indem Sie manuell die überprüfung der status-code, so etwas wie dieses:
Würden Sie brauchen, um einige Dinge hinzufügen, wie versucht wird, einen vordefinierten Anzahl von Zeiten, bevor er eine endgültige Ausnahme und fangen einige geprüft (Ausnahmen wie die InterruptedException ausgelöst durch
Thread.sleep()
), aber im Grunde ist der code zeigt die Grundidee.