| name | java-resilience |
| description | Use when the user asks to add resilience patterns, handle service failures, implement circuit breaker, retry, rate limiter, bulkhead, or timeout in a Spring Boot project using Resilience4J. |
| version | 1.0.0 |
| authors | ["java-plugins contributors"] |
| tags | ["java","spring-boot","resilience4j","circuit-breaker","retry","rate-limiter","bulkhead","timeout"] |
| allowed-tools | ["Read","Glob","Grep","Edit","Write"] |
Resilience4J Skill
Detect the existing setup, then apply the correct pattern.
Step 1 — Detect setup
Check pom.xml or build.gradle:
resilience4j-spring-boot3 → Spring Boot 3.x (use io.github.resilience4j:resilience4j-spring-boot3)
resilience4j-spring-boot2 → Spring Boot 2.x
spring-cloud-starter-circuitbreaker-resilience4j → Spring Cloud Circuit Breaker abstraction
- None present → offer to add (recommend
resilience4j-spring-boot3 for Boot 3.x)
Check Java version: Java 17+ enables records for fallback DTOs; Java 8+ supported throughout.
Mode: review
User asks to review existing Resilience4J config. Check for:
Mode: circuit-breaker
User asks to add a circuit breaker to protect a downstream call.
- Add dependency (see
references/patterns.md → Setup)
- Configure in
application.yml — set sliding-window-size, failure-rate-threshold, wait-duration-in-open-state
- Annotate the method with
@CircuitBreaker(name = "serviceName", fallbackMethod = "fallback")
- Write the fallback method — same return type, extra
Throwable parameter
- Expose circuit breaker health:
management.health.circuitbreakers.enabled=true
- Add event listener to log state transitions (CLOSED→OPEN→HALF_OPEN)
Version note:
- Spring Boot 3.x →
resilience4j-spring-boot3
- Spring Boot 2.x →
resilience4j-spring-boot2
Mode: retry
User asks to add automatic retry for flaky remote calls.
- Configure retry in
application.yml — max-attempts, wait-duration, exponential-backoff-multiplier
- Set
ignore-exceptions for non-retryable errors (validation errors, 4xx responses)
- Set
retry-exceptions explicitly (e.g. IOException, TimeoutException)
- Annotate with
@Retry(name = "serviceName", fallbackMethod = "fallback")
- For HTTP clients: check response status before retrying — use
retryOnResultPredicate to retry on 5xx, not 4xx
- Warn if stacking with
@CircuitBreaker — retry fires first, circuit breaker wraps it; set retry.max-attempts lower than circuit breaker sliding-window-size
Mode: rate-limiter
User asks to limit how often a method can be called (outgoing rate limiting or incoming API protection).
- Configure
limit-for-period (requests per window), limit-refresh-period, timeout-duration
- Annotate with
@RateLimiter(name = "serviceName", fallbackMethod = "fallback")
- For incoming API protection: place on controller method or use a filter
- For outgoing: place on the service/client method calling the downstream
Mode: bulkhead
User asks to limit concurrent calls to isolate failures (prevent thread starvation).
Two types — choose based on context:
- Semaphore bulkhead (default): limits concurrent calls via a counter — lightweight, same thread pool
- ThreadPool bulkhead: executes in a dedicated pool — true isolation, for blocking I/O
Configure max-concurrent-calls and max-wait-duration (semaphore) or pool size (thread pool).
Annotate with @Bulkhead(name = "serviceName", type = Bulkhead.Type.SEMAPHORE).
Mode: timeout
User asks to add a timeout to a method.
- Use
@TimeLimiter for reactive/async methods (returns CompletableFuture or Flux/Mono)
- For blocking methods: use
@CircuitBreaker with slowCallDurationThreshold instead
- Configure
timeout-duration in application.yml
@TimeLimiter requires the method to return CompletableFuture<T> — wrap synchronous calls if needed
Output format
For review mode: list findings as [CRITICAL] / [HIGH] / [MEDIUM] / [LOW] with file:line references.
For implementation modes: show exact Maven/Gradle snippet, full application.yml config block, and complete annotated Java example. State minimum Spring Boot version where relevant.