failsafe v2.0 Release Notes

  • 👌 Improvements

    • 👍 [Policy composition]( is now supported.
    • [A Policy SPI]( is now available.
    • ⏱ Async execution is now supported without requiring that a ScheduledExecutorService or Scheduler be configured. When no scheduler is configured, the ForkJoinPool's common pool will be used by default.
    • 👍 Fallback now support async execution via ofAsync.
    • 👀 CircuitBreaker supports execution metrics (see below).
    • 👍 Strong typing based on result types is supported throughout the API.

    Behavior Changes

    • 0️⃣ RetryPolicy now has 3 max attempts by default.
    • 0️⃣ CircuitBreaker now has a 1 minute delay by default.

    JRE Changes

    • Java 8+ is now required

    API Changes

    Failsafe 2.0 includes a few API changes from 1.x that were meant to consolidate behavior such as the execution APIs, which are now based on common Policy implementations, while adding some new features such as Policy composition.

    • Policies
      • Policy implementations now take a type parameter R that represents the expected result type.
      • Some of the time related policy configurations have been changed to use Duration instead of long + TimeUnit.
    • 🔧 Policy configuration
      • Multiple policies can no longer be configured by chaining multiple Failsafe.with calls. Instead they must be supplied in a single Failsafe.with call. This is was intentional to require users to consider the ordering of composed policies. See the README section on [policy composition]( for more details.
    • RetryPoilicy
      • The retryOn, retryIf, and retryWhen methods have been replace with handleOn, etc.
    • CircuitBreaker
      • The failOn, failIf, and failWhen methods have been replace with handleOn, etc.
    • Fallbacks
      • Fallbacks must be wrapped in a Fallback instance via Fallback.of
    • Failsafe APIs
      • Suppliers are now used instead of Callables.
      • java.util.function.Predicate is used instead of Failsafe's internal Predicate.
      • withFallback is no longer supported. Instead, Failsafe.with(fallback...) should be used.
    • Async execution
      • Async execution is now performed with the getAsync, runAsync, getStageAsync, etc. methods.
      • Async API integration is now supported via the getAsyncExecution, runAsyncExecution, etc. methods.
    • Event listeners
      • Event listeners now all consume a single ExecutionEvent object, which includes references to the result, failure, and other information.
      • Event listeners that are specific to policies, such as onRetry for RetryPolicy, must now be configured through the policy instance. The top level Failsafe API only supports onComplete, onSuccess, and onFailure. Individual Policy implementations still support onSuccess and onFailure in addition to policy specific events.
      • The top level Failsafe.onSuccess event listener will only be called if all configured policies consider an execution to be successful, otherwise onFailure will be called.
      • The Listeners class was removed, since it was mostly intended for Java 6/7 users.
      • The async event listener APIs were removed. Events will always be delivered in the same thread as the execution that they follow or preceed, including for async executions.
    • Java 8
      • java.time.Duration is used instead of Failsafe's own Duration impl.
      • ChronoUnit is used instead of TimeUnit in policies.
    • ExecutionContext.getExecutions is now getAttemptCount.
    • Schedulers.of(ScheduledExecutorService) was moved to the Scheduler interface.

    API Additions

    • CircuitBreaker
      • preExecute is now exposed to support standalone usage.
      • Execution metrics are available via getFailureCount, getFailureRatio, getSuccessCount, and getSuccessRatio.

    🐛 Bug Fixes

    • Issue #152 - Min/max delay was not being computed correctly