Komplet guide til Spring Boot 4 · Lektion

Jobs, steps og JobRepository-modellen

Strukturér batch-workloads med jobs, steps og metadata-persistens til sporing af eksekveringer.

Lektion 1 af 413 trin

Jobs, steps og JobRepository-modellen er en gratis Komplet guide til Spring Boot 4-lektion på CoddyKit. Dette er lektion 1 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Komplet guide til Spring Boot 4, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Komplet guide til Spring Boot 4-kurset indeholder 4 lektioner i alt.

Hvorfor Spring Batch findes

Mange arbejdsbelastninger fra den virkelige verden følger ikke mønsteret med anmodning og svar: generering af fakturaer om natten, CSV-importer, rapporteksporter og datamigreringer. Disse køres som batchjob, der behandler store mængder poster.

  • De skal kunne genstartes efter et nedbrud.
  • De skal spore fremdriften, så du ved, hvad der allerede er kørt.
  • De skal kunne håndtere millioner af rækker uden at indlæse alt i hukommelsen.

Spring Batch giver dig en struktureret model til netop dette. De tre centrale abstraktioner, du først skal forstå, er Job, Step og JobRepository.

Jobbet: en arbejdsenhed

Et Job er den overordnede container for en hel batchproces. Det har et navn og består af en eller flere ordnede Step-instanser.

  • Én Job-definition kan køres mange gange — hver kørsel er en JobInstance.
  • Hvert forsøg på at køre en JobInstance er en JobExecution (status, starttidspunkt, afslutningskode).

I Spring Boot 4 opbygger du et Job med en JobBuilder, hvor du angiver et navn og et JobRepository.

@Bean
public Job importInvoicesJob(JobRepository jobRepository, Step readStep) {
    return new JobBuilder("importInvoicesJob", jobRepository)
            .start(readStep)
            .build();
}

JobInstance kontra JobExecution

Denne skelnen er kernen i muligheden for genstart. Antag, at du kører importInvoicesJob for datoen 2026-06-10.

  • JobInstance identificeres af jobbets navn plus dets identificerende jobparametre (her datoen). Hvis du kører igen med den samme dato, henviser det til den samme instans.
  • Hver kørsel opretter en ny JobExecution. Hvis det første forsøg mislykkes, og du genstarter, får du en ny JobExecution for den samme JobInstance.

En fuldført JobInstance kan ikke køres igen med de samme identificerende parametre — Spring Batch kaster JobInstanceAlreadyCompleteException. Det forhindrer utilsigtet dobbeltbehandling.

Steppet: en fase i jobbet

Et Step er en selvstændig, sekventiel fase i et Job. Et Job kæder typisk flere steps sammen: valider input, behandl derefter poster, og send så en opsummeringsmail.

Der findes to typer steps:

  • Chunk-baseret: læs–behandl–skriv i konfigurerbare bidder. Ideelt til store datasæt.
  • Tasklet: én vilkårlig handling (slet en fil, kør en lagret procedure, ping en tjeneste).

Hver Step-kørsel spores af en StepExecution, som registrerer antallet af læste og skrevne poster, antallet af commits og status.

Et chunk-baseret step

Et chunk-baseret step forbinder en ItemReader, en valgfri ItemProcessor og en ItemWriter. Kaldet chunk(n, transactionManager) angiver commit-intervallet: efter hver n læste og behandlede poster tømmer writerens buffer, og transaktionen committer.

Mindre bidder betyder hyppigere commits (sikrere genstartspunkt, større overhead); større bidder betyder færre commits (hurtigere, men mere arbejde går tabt ved rollback).

@Bean
public Step readStep(JobRepository jobRepository,
                     PlatformTransactionManager txManager,
                     ItemReader<Invoice> reader,
                     ItemProcessor<Invoice, Invoice> processor,
                     ItemWriter<Invoice> writer) {
    return new StepBuilder("readStep", jobRepository)
            .<Invoice, Invoice>chunk(100, txManager)
            .reader(reader)
            .processor(processor)
            .writer(writer)
            .build();
}

Et Tasklet-step

Når en fase er én enkelt handling i stedet for en strøm af poster, skal du bruge et Tasklet. Metoden execute returnerer RepeatStatus.FINISHED, når den er færdig, eller CONTINUABLE, hvis den skal kaldes igen.

Tasklets er perfekte til opsætnings- og oprydningssteps, f.eks. arkivering af en behandlet fil eller tømning af en stagingtabel.

@Bean
public Step cleanupStep(JobRepository jobRepository,
                        PlatformTransactionManager txManager) {
    return new StepBuilder("cleanupStep", jobRepository)
            .tasklet((contribution, chunkContext) -> {
                Path staging = Path.of("/data/staging.csv");
                Files.deleteIfExists(staging);
                return RepeatStatus.FINISHED;
            }, txManager)
            .build();
}

Sammensætning af steps til et job

Steps køres i den rækkefølge, du erklærer dem i. Brug start(...) til det første step og next(...) til at kæde resten sammen. Som standard stopper jobbet, hvis et Step slutter med status FAILED.

Her validerer jobbet, importerer og rydder derefter op. Hvis importsteppet mislykkes, køres cleanupStep ikke, og ved en genstart fortsætter jobbet fra det mislykkede step.

@Bean
public Job invoiceJob(JobRepository jobRepository,
                      Step validateStep, Step readStep, Step cleanupStep) {
    return new JobBuilder("invoiceJob", jobRepository)
            .start(validateStep)
            .next(readStep)
            .next(cleanupStep)
            .build();
}

JobRepository: vedvarende hukommelse

JobRepository er den komponent, der gemmer alle batchmetadata: hvilke JobInstances der findes, deres JobExecutions, hver StepExecution og eksekveringskonteksterne.

  • Det er sådan, Spring Batch ved, at et job allerede er fuldført.
  • Det er sådan, en genstart finder ud af, hvor den skal fortsætte.
  • Det gemmer antal læsninger, skrivninger og commits til overvågning.

Som standard skriver det til en relationsdatabase ved hjælp af et sæt BATCH_*-tabeller. Uden et fungerende JobRepository er der ingen mulighed for genstart og ingen eksekveringshistorik — det er ikke valgfrit.

BATCH_-metadatabellerne

JobRepository gemmer data i et fast skema. De vigtigste tabeller er:

  • BATCH_JOB_INSTANCE — én række pr. JobInstance (navn + identitetshash).
  • BATCH_JOB_EXECUTION — én række pr. kørselsforsøg med status og afslutningskode.
  • BATCH_STEP_EXECUTION — tællere pr. step (antal læste, skrevne og sprunget over).
  • BATCH_JOB_EXECUTION_CONTEXT / BATCH_STEP_EXECUTION_CONTEXT — serialiseret tilstand, der bruges til at genoptage.
  • BATCH_*_SEQ — sekvenser til primærnøgler.

Spring Boot leverer DDL'en og kan oprette disse automatisk. Egenskaben nedenfor initialiserer skemaet ved opstart.

# application.properties
spring.batch.jdbc.initialize-schema=always
# Prevent jobs from auto-running on app startup
spring.batch.job.enabled=false

Start af et job

Du kører et Job gennem en JobLauncher ved at videregive JobParameters. Identificerende parametre definerer JobInstance; her gør kørselsdatoen hver dag til en separat instans.

Launcheren returnerer en JobExecution, hvis status (COMPLETED, FAILED, STOPPED) afspejler kørslen. Alt dette registreres i JobRepository.

@Component
public class InvoiceJobRunner {
    private final JobLauncher jobLauncher;
    private final Job invoiceJob;

    public InvoiceJobRunner(JobLauncher jobLauncher, Job invoiceJob) {
        this.jobLauncher = jobLauncher;
        this.invoiceJob = invoiceJob;
    }

    public void run(LocalDate date) throws Exception {
        JobParameters params = new JobParametersBuilder()
                .addLocalDate("runDate", date)
                .toJobParameters();
        JobExecution execution = jobLauncher.run(invoiceJob, params);
        System.out.println("Status: " + execution.getStatus());
    }
}

Sådan bruger en genstart repositoryet

Sæt delene sammen. Når et Job mislykkes under kørsel:

  • Den mislykkede JobExecution markeres som FAILED, men dens JobInstance markeres ikke som afsluttet.
  • Hvert gennemført Step registreres. Et chunk-orienteret trin gemmer også, hvor mange elementer det har behandlet, i sin ExecutionContext.
  • Hvis du starter igen med de samme identificerende parametre, oprettes en ny JobExecution for den samme instans. Spring Batch springer allerede gennemførte trin over og genoptager det mislykkede trin fra den senest bekræftede chunk.

Det er derfor, identificerende parametre og JobRepository skal være stabile: De angiver genoptagelsespunktet.

Hurtigt tjek

Afprøv din forståelse af modellen for job, instans og kørsel.

Opsummering

Du har nu den strukturelle model for Spring Batch:

  • Job — processen på øverste niveau, opbygget med JobBuilder og sammensat af trin i en bestemt rækkefølge.
  • JobInstance og JobExecution — en instans identificeres af navn + identificerende parametre; hvert kørselsforsøg er en separat kørsel.
  • Step — en fase, enten chunk-orienteret (læs/behandl/skriv med et bekræftelsesinterval) eller en tasklet (én enkelt handling), som spores af en StepExecution.
  • JobRepository — vedvarende metadata i tabellerne BATCH_*, som muliggør genstart, genoptagelseslogik og overvågning.

Få styr på disse, så falder resten af Spring Batch — læsere, skrivere, lyttere og partitionering — naturligt på plads ovenpå.

Gratis at komme i gang

Lær Java med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
21
Lektioner
84

Ofte stillede spørgsmål

Er lektionen “Jobs, steps og JobRepository-modellen” gratis?

Ja — alle 3 lektioner i læringssporet Komplet guide til Spring Boot 4, inklusive “Jobs, steps og JobRepository-modellen”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Komplet guide til Spring Boot 4-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Jobs, steps og JobRepository-modellen”?

Strukturér batch-workloads med jobs, steps og metadata-persistens til sporing af eksekveringer. Du øver dig i Komplet guide til Spring Boot 4 med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Komplet guide til Spring Boot 4?

Der kræves ingen tidligere erfaring. Komplet guide til Spring Boot 4 på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 1 af 4.

Hvor lang tid tager lektionen “Jobs, steps og JobRepository-modellen”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Komplet guide til Spring Boot 4-lektion?

Ja. Alle Komplet guide til Spring Boot 4-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Jobs, steps og JobRepository-modellen
  2. Chunk-orienterede reader-processor-writer-flows
  3. Fault tolerance, skip- og retry-politikker
  4. Partitionering og parallel step-eksekvering
← Tilbage til Komplet guide til Spring Boot 4