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
This commit is contained in:
Executable
+28
@@ -0,0 +1,28 @@
|
||||
#!/usr/bin/env bash
|
||||
# Runs one scenario against its own external H2 file database and CSV drop file (both under
|
||||
# scenario-data/<name>/, outside target/ so a rebuild never touches them -- see
|
||||
# docs/07-restartability.md for why that matters: `mvn spring-boot:run` re-copies
|
||||
# src/main/resources over target/classes before every run, which would silently undo an
|
||||
# in-place "fix" to a classpath resource between two runs of the same scenario.
|
||||
#
|
||||
# ./scripts/run-scenario.sh <name> <profile> <source-csv>
|
||||
#
|
||||
# Reuses the packaged jar (target/spring-batch-1.0.0.jar); run `mvn -B -o -DskipTests package`
|
||||
# first if it is missing or stale.
|
||||
set -euo pipefail
|
||||
cd "$(dirname "$0")/.."
|
||||
|
||||
NAME="${1:?usage: run-scenario.sh <name> <profile> <source-csv>}"
|
||||
PROFILE="${2:?usage: run-scenario.sh <name> <profile> <source-csv>}"
|
||||
SRC_CSV="${3:?usage: run-scenario.sh <name> <profile> <source-csv>}"
|
||||
|
||||
DIR="scenario-data/${NAME}"
|
||||
mkdir -p "$DIR"
|
||||
if [ ! -f "$DIR/input.csv" ]; then
|
||||
cp "$SRC_CSV" "$DIR/input.csv"
|
||||
fi
|
||||
|
||||
java -jar target/spring-batch-1.0.0.jar \
|
||||
--spring.profiles.active="$PROFILE" \
|
||||
--import.file="file:${DIR}/input.csv" \
|
||||
--spring.datasource.url="jdbc:h2:file:${PWD}/${DIR}/db"
|
||||
Reference in New Issue
Block a user