# 5. Production checklist: which one, for what [Previous: 04-concurrency-limit.md](04-concurrency-limit.md) | [README](../README.md) A decision list, built from what chapters 1-4 actually demonstrated rather than from either library's marketing: - **Need a circuit breaker (state that remembers a dependency is down across calls)?** Resilience4j. Nothing in Spring Framework 7 core does this — verified by grepping `spring-context-7.0.9.jar` for `circuitbreaker` (zero matches). See [chapter 1](01-two-resilience-stacks.md). - **Need declarative retry with backoff, and don't already depend on Resilience4j?** `@Retryable` from core is genuinely enough — one annotation, no extra dependency, verified attribute set in [chapter 1](01-two-resilience-stacks.md). Remember it has no fallback and no memory between calls ([chapter 3](03-spring-retryable.md)). - **Need a rate limiter (calls per second, not concurrent calls)?** Resilience4j. There is no rate limiter in Framework 7 core at all. - **Need to cap concurrency, and unlimited blocking for the overflow is acceptable?** `@ConcurrencyLimit(policy = BLOCK)` — one annotation. - **Need to cap concurrency with a bounded wait before giving up?** Resilience4j's Bulkhead with `maxWaitDuration` — `@ConcurrencyLimit` has no equivalent ([chapter 4](04-concurrency-limit.md)). - **Need Actuator health/metrics integration, a dashboard, Micrometer gauges per instance?** Resilience4j — `management.health.circuitbreakers.enabled=true` and the `resilience4j_circuitbreaker_*` Micrometer series have no equivalent for the core annotations. - **Migrating off Resilience4j specifically to cut a dependency?** You can drop it only for the retry and simple-throttle cases above. Circuit breaking and rate limiting are not replaced; they're just gone if you remove the dependency. ## Gotchas that apply to both, not just one - `@EnableResilientMethods` is not auto-configured by Boot 4.1 — add it yourself ([chapter 1](01-two-resilience-stacks.md)). - `spring-boot-starter-aop` does not exist on Boot 4 — use `spring-aop` directly, and add `aspectjweaver` explicitly if you're using Resilience4j's `@Aspect`-based integration, or the annotations will silently do nothing ([chapter 1](01-two-resilience-stacks.md)). - Self-invocation bypasses both, silently, the same way it always has for `@Transactional` and `@Async` ([chapter 3](03-spring-retryable.md)). ## Before shipping this repo's app Nothing here needs removing before production — there's no diagnostic endpoint exposing internals, just the standard Actuator `health`/`metrics`/`circuitbreakers` set, which is meant to be exposed (behind auth) in production anyway.