Skip to content

0.2.0

Choose a tag to compare

@fabiangftech fabiangftech released this 27 Oct 13:48
· 86 commits to main since this release

Released 2026-10-25. On Maven Central as dev.resilience4cata:*:0.2.0 (installation, documentation).

Fixes three behaviour bugs of 0.1.0; one of the fixes changes a default (see Upgrading).

Upgrading from 0.1.0

  • Keep core and processor on the same version (import the BOM). Code generated by the 0.2.0 processor needs the 0.2.0 core; code generated by 0.1.0 still links against the 0.2.0 core, which only adds API.
  • abortOn no longer contains CallNotPermittedException by default, because an open circuit breaker now stops the retries on its own. Remove CallNotPermittedException from your own abortOn lists if you added it only for that; it does no harm if you keep it.
  • A call rejected by an open breaker can no longer be retried by any configuration, classifier included.

Changed

  • An open circuit breaker always stops the retries. A call rejected with CallNotPermittedException is never retried, whatever abortOn, retryOn or a classifier say, in generated code (sync and async) and in Pipeline. In 0.1.0 this came from the default abortOn, so setting your own abortOn silently dropped it and the retry kept calling an open breaker. RetryConfig.DEFAULTS.abortOn() (and defaults.retry.abortOn) is now empty; Retry.

Fixed

  • FallbackEvent.Applied is no longer published for a failure that no sibling fallback method takes (for example an Error when the only sibling takes Exception): such a failure is rethrown, and the event now means that a fallback really ran.
  • Error messages R4C-ATR-001 and R4C-CFG-002 state the duration grammar once instead of twice, and R4C-CFG-007 ends its sentence before "Known configs".
  • The processor's module descriptor declares AnnotationClaimer too, so -Xlint:processing stays quiet when the processor runs from the processor module path next to other processors.
  • A classifier that throws inside @CircuitBreaker (or a Pipeline's breaker) now ends the call at once, sync and async: the retry around it no longer classifies the classifier's exception as the method's failure and retries it (which could open the breaker and surface CallNotPermittedException instead). The breaker records one failure, the retry publishes GaveUp(CLASSIFIER_FAILED) once, and the fallback or the caller gets the classifier's exception. See A classifier that throws.