Spring operational components expose health, task admission and cache behavior under explicit application policies.
Learning roadmap
Read the contract, run the source-kit checks, and inspect a rejected input before extending the application. This subject covers Spring and Spring Boot together; Java language lessons remain in their own subject.
Prerequisites
Use Java object ownership, interfaces, exceptions and Maven builds before the framework-specific lessons.
Section lessons
- Spring Boot Actuator health: public liveness without public diagnostics
- Spring task executors: capacity, rejection and lost context
- Spring cache keys: separate tenants and test the loader count
- Spring Boot metrics: bound tag values instead of tracking each receipt
- Spring cache eviction: invalidate the same tenant key used by the read
- Spring readiness: report an unavailable dependency without forcing liveness failure
- Spring @Cacheable sync: collapse a local same-key cache miss
- At-least-once delivery: where Spring outbox retries can duplicate work
- Spring Boot readiness health group: withdraw traffic on a required dependency failure
- Spring Boot liveness versus readiness: do not restart on every dependency outage
- Spring outbox retries: due time, delay cap, and attempt accounting
- Spring outbox retry budget: park a poison event for inspection
- Spring outbox polling: cap work per tick and measure backlog age
- Spring scheduled retries: leave failed work pending until its due time
- Spring relay metrics: measure backlog without event-ID labels
- Spring Boot graceful shutdown: finish accepted requests within a deadline
- Spring worker shutdown: release admission before a lease expires
- Spring readiness during termination: stop routing before stopping dependencies
Continue learning
Boot Foundations, Spring Core, Web APIs, Data & Transactions, Security, Testing, Exercises, Quizzes, Projects.
Batch jobs and trace context
- Spring Batch chunk restart: know which receipts committed
- Spring async trace context: follow work across executor threads
Kafka delivery boundaries
- Spring Kafka manual acknowledgement: commit work before advancing the offset
- Spring Kafka record keys: preserve per-SKU order without claiming global order
- Spring Kafka producer future: observe broker send completion separately from command success
- Spring Kafka listener failures: separate transient retries from poison records
Spring Cloud boundary lessons
- Spring Cloud discovery: a service name locates an instance, not a trusted peer
- Spring Cloud client retries: distinguish a safe read from an uncertain write
- Spring Cloud Circuit Breaker: make fallback obey the original data contract
Spring AI boundary lessons
Batch restart and recovery
- Spring Batch job identity: a manifest ID defines restart versus a new run
- Spring Batch skip and retry policy: distinguish bad input from temporary failure
Batch fault handling
- Spring Batch skip limits: the next invalid receipt fails the step
- Spring Batch retry exhaustion: a temporary error needs a finite stop
- Spring Batch reconciliation: report accepted and rejected receipt IDs
Modulith event and module tests
Batch recovery and rejected-row review
- Spring Batch restart across two JVMs after a recorded failed execution
- Spring Batch orphaned STARTED execution: inspect before relaunch
Batch metadata and hard-stop recovery
- Spring Boot 4 Batch JDBC starter: verify that job history is actually stored
- Spring Batch killed worker: fence it, recover STARTED, then restart
Integration, streaming and scheduling boundaries
- Spring Integration DirectChannel versus ExecutorChannel: where the transaction stops
- Spring Integration queue: bound memory and choose a real message store
- Spring Integration idempotent receiver: the metadata key is not the business commit
- Spring Integration poller: include receive and handler in the failure boundary
- Spring Cloud Stream consumer group: scale one logical reader without copying every event
- Spring Cloud Stream Kafka DLQ: stop poison messages without losing the trail
- Spring Cloud Stream producer failure: a sent message is not an accepted business command
- Spring @Scheduled on three replicas: the callback runs three times
Rabbit delivery and trace handoffs
- Spring AMQP prefetch: bound unacknowledged messages before raising concurrency
- Spring AMQP poison messages: reject, requeue and dead-letter are different decisions
- RabbitTemplate confirms and returns: broker acceptance is not consumer completion
- Spring Boot tracing across RestClient: construct the client from Boot's builder
- Spring Boot observation context across @Async and Reactor handoffs
Redis cache expiry and shared-writer behavior
- Spring Redis cache TTL versus idle expiry: GETEX changes the read contract
- Spring Redis cache key schema: tenant, prefix and rollout version
- Spring Redis cache writer: compound operations and replica stampedes
Route changes and Redis operations
- Spring Cloud Gateway route refresh: guard the actuator write boundary
- Spring Data Redis Cluster: key slots change multi-key operations
- Spring Redis cache outage: choose failure behavior per operation
Kubernetes configuration and discovery
- Spring Cloud Kubernetes config import: make source precedence explicit
- Spring Cloud Kubernetes reload: decide which changes need a restart
- Spring Cloud Kubernetes discovery: choose API lookup or Service DNS
Kubernetes workload permissions and probes
- Spring Cloud Kubernetes permissions: scope the service account to its reads
- Spring Boot Kubernetes probes: separate startup, readiness and liveness
- Spring Cloud Kubernetes watcher scope: filter before broadcasting refresh
Management and cache contracts
- Spring Actuator management port: separate listener, explicit access rule
- Spring Prometheus scrape endpoint: registry, exposure and label contract
- Spring health details: status for probes, diagnostics for operators
- Spring cache after commit: keep rolled-back writes out of readers
- Spring null-result caching: decide whether a miss should survive
- Spring Redis cache serialization: roll payload formats without mixed readers
- Spring tracing and logs: preserve request identity across outbound calls
- Spring Actuator loggers endpoint: temporary diagnosis with guarded write access
Logs, TLS rotation and startup evidence
- Spring Boot structured logs: stable fields without customer data
- Spring Boot SSL bundle rotation: replace certificate files with a verified handoff
- Spring Boot startup timeline: measure context work before extending probes
Batch scope, checkpoint and scaling contracts
- Spring Batch step scope: bind a reader to one execution
- Spring Batch job scope: avoid a shared bean in partition workers
- Spring Batch ExecutionContext keys: give each stream its own checkpoint
- Spring Batch FlatFileItemReader: save state against an immutable source
- Spring Batch partitioner: assign disjoint receipt ranges
- Spring Batch partition restart: preserve worker names and input slices
- Spring Batch multithreaded step: keep processor work independent of the chunk transaction
- Spring Batch parallel flows: make dependency order explicit
- Spring Batch flow status: distinguish step failure from job restartability
