Search in sources :

Example 16 with CancellationToken

use of com.azure.android.core.util.CancellationToken in project azure-sdk-for-android by Azure.

the class RetryPolicyTests method fixedDelayRetry.

@Test
public void fixedDelayRetry() {
    final int maxRetries = 5;
    final long delayMillis = 500;
    final HttpPipeline pipeline = new HttpPipelineBuilder().httpClient(new NoOpHttpClient() {

        int count = -1;

        long previousAttemptMadeAt = -1;

        @Override
        public void send(HttpRequest httpRequest, CancellationToken cancellationToken, HttpCallback httpCallback) {
            if (count > 0) {
                Assertions.assertTrue(System.currentTimeMillis() >= previousAttemptMadeAt + delayMillis);
            }
            Assertions.assertTrue(count++ < maxRetries);
            previousAttemptMadeAt = System.currentTimeMillis();
            httpCallback.onSuccess(new MockHttpResponse(httpRequest, 500));
        }
    }).policies(new RetryPolicy(new FixedDelay(maxRetries, Duration.ofMillis(delayMillis)))).build();
    CountDownLatch latch = new CountDownLatch(1);
    pipeline.send(new HttpRequest(HttpMethod.GET, "http://localhost/"), RequestContext.NONE, CancellationToken.NONE, new HttpCallback() {

        @Override
        public void onSuccess(HttpResponse response) {
            latch.countDown();
        }

        @Override
        public void onError(Throwable error) {
            latch.countDown();
        }
    });
    awaitOnLatch(latch, "fixedDelayRetry");
}
Also used : HttpRequest(com.azure.android.core.http.HttpRequest) CancellationToken(com.azure.android.core.util.CancellationToken) HttpPipelineBuilder(com.azure.android.core.http.HttpPipelineBuilder) HttpCallback(com.azure.android.core.http.HttpCallback) HttpResponse(com.azure.android.core.http.HttpResponse) CountDownLatch(java.util.concurrent.CountDownLatch) HttpPipeline(com.azure.android.core.http.HttpPipeline) Test(org.junit.jupiter.api.Test)

Example 17 with CancellationToken

use of com.azure.android.core.util.CancellationToken in project azure-sdk-for-android by Azure.

the class RetryPolicyTests method exponentialDelayRetry.

@Test
public void exponentialDelayRetry() {
    final int maxRetries = 5;
    final long baseDelayMillis = 100;
    final long maxDelayMillis = 1000;
    ExponentialBackoff exponentialBackoff = new ExponentialBackoff(maxRetries, Duration.ofMillis(baseDelayMillis), Duration.ofMillis(maxDelayMillis));
    final HttpPipeline pipeline = new HttpPipelineBuilder().httpClient(new NoOpHttpClient() {

        int count = -1;

        long previousAttemptMadeAt = -1;

        @Override
        public void send(HttpRequest httpRequest, CancellationToken cancellationToken, HttpCallback httpCallback) {
            if (count > 0) {
                long requestMadeAt = System.currentTimeMillis();
                long expectedToBeMadeAt = previousAttemptMadeAt + ((1 << (count - 1)) * (long) (baseDelayMillis * 0.95));
                Assertions.assertTrue(requestMadeAt >= expectedToBeMadeAt);
            }
            Assertions.assertTrue(count++ < maxRetries);
            previousAttemptMadeAt = System.currentTimeMillis();
            httpCallback.onSuccess(new MockHttpResponse(httpRequest, 503));
        }
    }).policies(new RetryPolicy(exponentialBackoff)).build();
    CountDownLatch latch = new CountDownLatch(1);
    pipeline.send(new HttpRequest(HttpMethod.GET, "http://localhost/"), RequestContext.NONE, CancellationToken.NONE, new HttpCallback() {

        @Override
        public void onSuccess(HttpResponse response) {
            latch.countDown();
        }

        @Override
        public void onError(Throwable error) {
            latch.countDown();
        }
    });
    awaitOnLatch(latch, "exponentialDelayRetry");
}
Also used : HttpRequest(com.azure.android.core.http.HttpRequest) CancellationToken(com.azure.android.core.util.CancellationToken) HttpPipelineBuilder(com.azure.android.core.http.HttpPipelineBuilder) HttpCallback(com.azure.android.core.http.HttpCallback) HttpResponse(com.azure.android.core.http.HttpResponse) CountDownLatch(java.util.concurrent.CountDownLatch) HttpPipeline(com.azure.android.core.http.HttpPipeline) Test(org.junit.jupiter.api.Test)

Example 18 with CancellationToken

use of com.azure.android.core.util.CancellationToken in project azure-sdk-for-android by Azure.

the class RetryPolicyTests method retryEndOn501.

@Test
public void retryEndOn501() {
    final HttpPipeline pipeline = new HttpPipelineBuilder().httpClient(new NoOpHttpClient() {

        // Send 408, 500, 502, all retried, with a 501 ending
        private final int[] codes = new int[] { 408, 500, 502, 501 };

        private int count = 0;

        @Override
        public void send(HttpRequest httpRequest, CancellationToken cancellationToken, HttpCallback httpCallback) {
            httpCallback.onSuccess(new MockHttpResponse(httpRequest, codes[count++]));
        }
    }).policies(new RetryPolicy(new FixedDelay(3, Duration.of(0, ChronoUnit.MILLIS)))).build();
    final HttpResponse[] httpResponse = new HttpResponse[1];
    CountDownLatch latch = new CountDownLatch(1);
    pipeline.send(new HttpRequest(HttpMethod.GET, "http://localhost/"), RequestContext.NONE, CancellationToken.NONE, new HttpCallback() {

        @Override
        public void onSuccess(HttpResponse response) {
            httpResponse[0] = response;
            latch.countDown();
        }

        @Override
        public void onError(Throwable error) {
            try {
                throw new RuntimeException(error);
            } finally {
                latch.countDown();
            }
        }
    });
    awaitOnLatch(latch, "retryEndOn501");
    assertNotNull(httpResponse[0]);
    assertEquals(501, httpResponse[0].getStatusCode());
}
Also used : HttpRequest(com.azure.android.core.http.HttpRequest) CancellationToken(com.azure.android.core.util.CancellationToken) HttpPipelineBuilder(com.azure.android.core.http.HttpPipelineBuilder) HttpCallback(com.azure.android.core.http.HttpCallback) HttpResponse(com.azure.android.core.http.HttpResponse) CountDownLatch(java.util.concurrent.CountDownLatch) HttpPipeline(com.azure.android.core.http.HttpPipeline) Test(org.junit.jupiter.api.Test)

Example 19 with CancellationToken

use of com.azure.android.core.util.CancellationToken in project azure-sdk-for-android by Azure.

the class CFBackedPageAsyncStream method forEach.

@Override
public CancellationToken forEach(AsyncStreamHandler<PagedResponse<T>> handler) {
    final CancellationToken token = new CancellationToken();
    handler.onInit(token);
    if (token.isCancellationRequested()) {
        handler.onError(new CancellationException());
        return token;
    }
    final CompletableFuture<Void> completableFuture = this.enumeratePages(startPageId, token, handler);
    token.registerOnCancel(() -> {
        completableFuture.cancel(true);
    });
    completableFuture.whenCompleteAsync((ignored, throwable) -> {
        if (throwable != null) {
            if (throwable instanceof CompletionException && throwable.getCause() != null) {
                // unwrap CF's CompletionException.
                handler.onError(throwable.getCause());
            } else {
                handler.onError(throwable);
            }
        } else {
            handler.onComplete();
        }
    });
    return token;
}
Also used : CancellationToken(com.azure.android.core.util.CancellationToken) CancellationException(java.util.concurrent.CancellationException) CompletionException(java9.util.concurrent.CompletionException)

Aggregations

CancellationToken (com.azure.android.core.util.CancellationToken)19 HttpRequest (com.azure.android.core.http.HttpRequest)15 CountDownLatch (java.util.concurrent.CountDownLatch)15 HttpCallback (com.azure.android.core.http.HttpCallback)14 HttpResponse (com.azure.android.core.http.HttpResponse)14 HttpPipeline (com.azure.android.core.http.HttpPipeline)13 HttpPipelineBuilder (com.azure.android.core.http.HttpPipelineBuilder)13 Test (org.junit.jupiter.api.Test)13 HttpHeaders (com.azure.android.core.http.HttpHeaders)4 CancellationException (java.util.concurrent.CancellationException)4 HttpCallDispatcher (com.azure.android.core.http.HttpCallDispatcher)2 HttpClient (com.azure.android.core.http.HttpClient)2 IOException (java.io.IOException)2 CompletionException (java9.util.concurrent.CompletionException)2 ResourceLock (org.junit.jupiter.api.parallel.ResourceLock)2 ParameterizedTest (org.junit.jupiter.params.ParameterizedTest)2 MethodSource (org.junit.jupiter.params.provider.MethodSource)2 HttpResponseException (com.azure.android.core.http.exception.HttpResponseException)1 NoOpHttpClient (com.azure.android.core.test.http.NoOpHttpClient)1 ByteArrayInputStream (java.io.ByteArrayInputStream)1