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
56 lines
2.7 KiB
Bash
Executable File
56 lines
2.7 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Captures real javap output pinning the Spring Batch 6.0 API facts this article relies on:
|
|
# the ChunkOrientedStepBuilder that chunk(int) now returns, the two different ExecutionContext
|
|
# classes, the package move of RepeatStatus, and CommandLineJobRunner's deprecation (NOT removal
|
|
# -- an earlier draft trusted a migration-guide summary that said "removed" and this transcript
|
|
# is what caught the error; see docs/09-corrections.md).
|
|
#
|
|
# ./scripts/capture-javap.sh
|
|
#
|
|
# Needs the spring-batch-core and spring-batch-infrastructure 6.0.5 jars in the local Maven repo
|
|
# (a normal `mvn -B -o package` in this module already pulls them in).
|
|
set -euo pipefail
|
|
cd "$(dirname "$0")/.."
|
|
|
|
CORE=$(find "$HOME/.m2" -name 'spring-batch-core-6.0.5.jar' | head -1)
|
|
INFRA=$(find "$HOME/.m2" -name 'spring-batch-infrastructure-6.0.5.jar' | head -1)
|
|
: "${CORE:?spring-batch-core-6.0.5.jar not found in ~/.m2 -- run mvn -B -o package first}"
|
|
: "${INFRA:?spring-batch-infrastructure-6.0.5.jar not found in ~/.m2 -- run mvn -B -o package first}"
|
|
|
|
WORK=$(mktemp -d)
|
|
mkdir -p "$WORK/core" "$WORK/infra"
|
|
unzip -o -q "$CORE" -d "$WORK/core"
|
|
unzip -o -q "$INFRA" -d "$WORK/infra"
|
|
|
|
mkdir -p docs/output
|
|
|
|
{
|
|
echo "# javap org.springframework.batch.core.step.builder.StepBuilder (spring-batch-core 6.0.5)"
|
|
echo
|
|
echo '$ javap -cp spring-batch-core-6.0.5.jar org.springframework.batch.core.step.builder.StepBuilder'
|
|
javap -cp "$WORK/core" org.springframework.batch.core.step.builder.StepBuilder
|
|
} > docs/output/03-stepbuilder-chunk-overloads.txt
|
|
|
|
{
|
|
echo "# javap: two ExecutionContext classes in two different packages"
|
|
echo
|
|
echo '$ javap -cp spring-batch-infrastructure-6.0.5.jar org.springframework.batch.infrastructure.item.ExecutionContext'
|
|
javap -cp "$WORK/infra" org.springframework.batch.infrastructure.item.ExecutionContext
|
|
echo
|
|
echo '$ javap -cp spring-batch-core-6.0.5.jar org.springframework.batch.core.repository.persistence.ExecutionContext'
|
|
javap -cp "$WORK/core" org.springframework.batch.core.repository.persistence.ExecutionContext
|
|
} > docs/output/04-two-executioncontext-classes.txt
|
|
|
|
{
|
|
echo "# javap: CommandLineJobRunner is deprecated (forRemoval), not removed, in 6.0.5"
|
|
echo
|
|
echo '$ javap -verbose -cp spring-batch-core-6.0.5.jar org.springframework.batch.core.launch.support.CommandLineJobRunner | grep -A3 "^public class\|Deprecated"'
|
|
javap -verbose -cp "$WORK/core" org.springframework.batch.core.launch.support.CommandLineJobRunner \
|
|
| grep -A3 '^public class\|Deprecated' | head -20
|
|
} > docs/output/09-commandlinejobrunner-deprecated-not-removed.txt
|
|
|
|
rm -rf "$WORK"
|
|
echo "wrote docs/output/03-stepbuilder-chunk-overloads.txt"
|
|
echo "wrote docs/output/04-two-executioncontext-classes.txt"
|
|
echo "wrote docs/output/09-commandlinejobrunner-deprecated-not-removed.txt"
|