Files
spring-boot-demo/README.md
T
Claude b81af72bc3 Add spring-batch: jobs, steps, chunk processing and restartability on Boot 4.1
Companion code for "Spring Batch on Boot 4.1: Jobs, Steps, Chunk Processing and
Restartability". A productImportJob configured three ways by profile against a
poisoned CSV row, run as real java -jar processes (not just JUnit) so the
restart story is genuine: a chunk fails and rolls back, the process exits, a
brand-new JVM against the same file-based H2 database resumes at the exact
next unread row (READ_COUNT 20, not 60) and completes.

Findings the build pins:
- StepBuilder.chunk(int, PlatformTransactionManager) still compiles in Batch
  6.0.5 but returns the legacy SimpleStepBuilder; chunk(int) returns the new
  ChunkOrientedStepBuilder, and only the latter is used here.
- Two different ExecutionContext classes now exist in two different packages
  (infrastructure.item vs core.repository.persistence) with different shapes.
- spring-boot-starter-batch alone gives a resourceless JobRepository that
  forgets every JobInstance the moment the JVM exits; spring-boot-starter-
  batch-jdbc is what makes the restart demo possible at all, demonstrated by
  excluding BatchJdbcAutoConfiguration and watching a "restart" collide with
  the previous run's own data instead of resuming it.
- A migration-guide summary claiming CommandLineJobRunner was removed in 6.0
  is wrong -- javap against the real jar shows @Deprecated(forRemoval=true),
  not removed.
- RepeatStatus moved from core.repeat to infrastructure.repeat, caught by the
  compiler rather than by reading docs.

11 documentation chapters, 10 captured transcripts (unit tests, javap output,
and real two-JVM scenario runs), all regenerated by scripts/run-all.sh.

Fixed after push: three dead docs.spring.io links in the doc chapters
(readersAndWriters/* and chunk-oriented-processing/*.html paths moved when
Spring Batch 6 reorganized its reference docs; corrected to the current
readers-and-writers/*, processor.html and chunk-oriented-processing.html
paths, verified 200 via curl before committing).

Co-Authored-By: Claude Sonnet 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_019DXsJ1zpikbA1MQJN6RqFA
2026-09-13 06:37:46 +00:00

4.4 KiB

spring-boot-demo

Companion code for the Spring Boot articles on ankurm.com.

One directory per article. Each is a self-contained Maven project with its own README.md, numbered documentation chapters under docs/, and captured real output under docs/output/ that a single script regenerates. Every figure quoted in an article came out of one of those files.

Directory Article What it demonstrates
actuator-in-production/ Spring Boot Actuator in Production endpoint exposure defaults, securing Actuator, custom health indicators and how they hang
spring-boot-startup-time/ Why Your Spring Boot App Takes 8 Seconds to Start BufferingApplicationStartup, JFR startup events, self time vs total time, the classpath-scan tax, the JDK 25 AOT cache
configuration-properties/ @ConfigurationProperties vs @Value in Spring Boot 4 relaxed binding measured three ways, record constructor binding, validation, IDE metadata generation
profiles-and-config/ Spring Boot Profiles Done Right the precedence stack made visible, config trees and ConfigMaps, why a profile file loses to an environment variable
spring-aop/ Spring AOP Explained every pointcut designator with real matches, JDK vs CGLIB proxies, six aspects that do not fire
docker-images/ Dockerizing Spring Boot 4: Layered Jars, Buildpacks, Distroless and Image Size Benchmarks one service packaged nine ways and measured: size on disk and pushed, rebuild delta, startup, PID 1 and signals, jlink, the JDK 25 AOT cache
kubernetes-deployment/ Deploying Spring Boot 4 on Kubernetes probe groups under a dependency outage, graceful shutdown under load four ways, JVM ergonomics per pod shape, CPU limits throttling GC, HPA on a Micrometer metric
problem-details/ Global Exception Handling with ProblemDetail (RFC 9457) in Spring Boot 4 thirteen failures under five handling setups, validation errors, i18n, content negotiation, errors outside MVC, silent 500s, decoding on the client
resilience/ Spring Framework 7's Built-in Resilience: @Retryable, @ConcurrencyLimit, and What's Left for Resilience4j @Retryable and @ConcurrencyLimit counted invocation by invocation, retries inside transactions, where Resilience4j still earns its place, migrating from Spring Retry
caching/ The Spring Cache Abstraction: @Cacheable, @CacheEvict, Key Generators and the Self-Invocation Trap the self-invocation trap measured four ways, the key collision SimpleKeyGenerator makes easy, eviction timing under a thrown exception, a rollback the cache keeps, and where this sits next to Hibernate's L2 cache
spring-batch/ Spring Batch on Boot 4.1: Jobs, Steps, Chunk Processing and Restartability a job that fails mid-chunk and resumes exactly where it left off across two separate JVMs, skip vs. restart on the same poisoned row, the resourceless job repository that forgets a restart ever happened, and the chunk(int) vs chunk(int, tx) builder split

Articles whose text is kept here rather than only on the blog have it under <directory>/post/post.md for the body and meta.md for the title, excerpt and categories.

Running any of them

Each project needs a JDK 25 and Maven 3.9. docker-images also needs Docker, and kubernetes-deployment Docker plus a Kubernetes cluster; their READMEs list the rest:

cd <directory>
export JAVA_HOME=/path/to/jdk-25
mvn -DskipTests package
./scripts/run-all.sh          # regenerate every transcript under docs/output/

Licence

MIT — see LICENSE.