Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- HttpResponse execute(HttpRequest request) throws TimeoutException {
- Stopwatch timer = Stopwatch.createStarted();
- for (int i = 0; i < MAX_RETRIES; i++) {
- if (timer.elapsed(TimeUnit.MILLISECONDS) > REQUEST_TIMEOUT) {
- throw new TimeoutException();
- }
- try {
- return tryExecute(request);
- } catch (ConnectionException e) {
- // cycle one more time
- }
- }
- throw new UnreachableHostException();
- }
- CompletableFuture<HttpResponse> execute(HttpRequest request, State state) {
- if (state.getTimer().elapsed(TimeUnit.MILLISECONDS) > REQUEST_TIMEOUT) {
- CompletableFuture<HttpResponse> synchronizer = new CompletableFuture<>();
- synchronizer.completeExceptionally(new TimeoutException());
- return synchronizer;
- }
- if (state.getAttempt() >= MAX_ATTEMPTS) {
- CompletableFuture<HttpResponse> synchronizer = new CompletableFuture<>();
- synchronizer.completeExceptionally(new UnreachableHostException());
- return synchronizer;
- }
- return tryExecute(request)
- // о да, мы идем прямо в ад. прошу не обращать
- // внимание на саму сложность конструкции
- .handle((result, throwable) -> {
- if (result != null) {
- return CompletableFuture.completedFuture(result);
- }
- if (throwable instanceof ConnectionException) {
- state.setAttempt(state.getAttempt() + 1);
- return execute(request, state);
- }
- CompletableFuture synchronizer = new CompletableFuture<>();
- synchronizer.completeExceptionally(throwable);
- return synchronizer;
- })
- .thenCompose(f -> f);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement