mcpField
R
resilience-retry

resilience-retry

github.com/rrezartprebrezaDevelopment32850 installsUpdated 6d ago
Repository

About resilience-retry

A guidance skill for choosing and correctly applying retry and resilience patterns in Spring Boot 3. It explains Spring Retry and Resilience4j tradeoffs, proxy behavior, transaction boundaries, and common implementation hazards.

Key features

  1. 01Spring Retry and Resilience4j selection guidance
  2. 02Retry attempt-count clarification
  3. 03Proxy and self-invocation caveats
  4. 04Transaction-boundary guidance
  5. 05Idempotency safeguards for writes

Use cases

  1. 01Choosing retry support for a Boot 3 service
  2. 02Combining retries with circuit breakers or bulkheads
  3. 03Reviewing retry behavior inside transactions
  4. 04Avoiding duplicate effects in payment operations

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/rrezartprebreza/spring-boot-skills --skill resilience-retry

After installing, type/resilience-retryin Claude Code to confirm it loaded.

Bundled files

References and scripts installed along with SKILL.md.

agents/
openai.yaml
examples/
bad-payment-client.java
good-payment-client.java

Details

From the project README

Resilience and Retry (Boot 3)

Boot 3 does not have Spring Framework 7 core resilience annotations. Choose Spring Retry for simple imperative retry or Resilience4j when you also need circuit breakers, rate limiting, or bulkheads. Keep the dependency and configuration explicit.

@Configuration
@EnableRetry
class RetryConfig { }

@Service
class PaymentClient {
    @Retryable(
        retryFor = ConnectException.class,
        maxAttempts = 4,
        backoff = @Backoff(delay = 200, multiplier = 2.0, maxDelay = 2000))
    PaymentResult charge(ChargeRequest request) { ... }

    @Recover
    PaymentResult recover(ConnectException error, ChargeRequest request) { ... }
}

Spring Retry's maxAttempts includes the initial call. Resilience4j is preferable when retry must be composed with a circuit breaker or bulkhead. Both approaches are proxy-based: self invocation bypasses advice, and retrying a method inside a rollback-only transaction does not create a fresh transaction for each attempt.

Gotchas

  • Agent uses Framework 7 @EnableResilientMethods - Boot 3 needs Spring Retry or Resilience4j.
  • Agent confuses maxAttempts with retry count - Spring Retry includes the initial call.
  • Agent adds @Recover to Resilience4j - recovery must be modeled with a fallback or caller handling.
  • Agent retries a self-invoked method - call through a Spring proxy.
  • Agent retries inside a transaction expecting a fresh transaction - move retry outside the transactional bean.
  • Agent retries non-idempotent writes without an idempotency key - protect payment and command operations.

Comments

Markdown supported