Retrofit
The Failsafe Retrofit integration allows Failsafe policies to be composed around Retrofit calls.
Setup
Add the latest failsafe and failsafe-retrofit dependencies to your project.
Usage
Create a FailsafeCall that composes a policy around a Retrofit Call:
Call call = client.newCall(request);
RetryPolicy<Response<User>> retryPolicy = RetryPolicy.ofDefaults();
FailsafeCall<User> failsafeCall = FailsafeCall.with(retryPolicy).compose(call);
// Execute with retries
Response<User> response = failsafeCall.execute();
Failure handling works just as it does with any Failsafe execution.
Async Execution
Async execution can also be performed for a FailsafeCall, which returns a CompletableFuture:
CompletableFuture<Response<User>> future = failsafeCall.executeAsync();
Policy Composition
Multiple policies can be composed around a Retrofit Call:
FailsafeCall<User> failsafeCall = FailsafeCall.with(fallback)
.compose(retryPolicy)
.compose(circuitBreaker)
.compose(call);
The same statement can also be written as:
FailsafeCall<User> failsafeCall = FailsafeCall.with(fallback, retryPolicy, circuitBreaker)
.compose(call);
See the policy-composition docs for more details.
Cancellation
When a FailsafeCall is cancelled, the underlying Retrofit Call is also cancelled:
failsafeCall.cancel();
This is also true when cancellation is performed via an async execution’s future:
CompletableFuture<Response<User>> future = failsafeCall.executeAsync();
future.cancel(false);
Failsafe Executor
A FailsafeExecutor configured with event listeners or an ExecutorService can be used to create a FailsafeCall:
FailsafeExecutor<Response<User>> failsafe = Failsafe.with(retryPolicy)
.with(executorService)
.onSuccess(e -> log.info("Found user {}", e.getResult()))
.onFailure(e -> log.error("Failed to find user", e.getException()));
FailsafeCall<User> failsafeCall = FailsafeCall.with(failsafe).compose(call);