Baggrundsjob i foråret med JobRunr

1. Oversigt

I denne vejledning vil vi se på distribueret baggrundsjobplanlægning og -behandling i Java ved hjælp af JobRunr og have det integreret med Spring.

2. Om JobRunr

JobRunr er et bibliotek, som vi kan integrere i vores applikation, og som giver os mulighed for at planlægge baggrundsjob ved hjælp af en Java 8 lambda. Vi kan bruge enhver eksisterende metode til vores Spring-tjenester til at oprette et job uden behov for at implementere en grænseflade. Et job kan være en kort eller langvarig proces, og det bliver automatisk aflæst til en baggrundstråd, så den aktuelle webanmodning ikke blokeres.

For at udføre sit job analyserer JobRunr Java 8 lambda. Det serialiseres som JSON og gemmer det i enten en relationsdatabase eller et NoSQL-datalager.

3. JobRunr-funktioner

Hvis vi ser, at vi producerer for mange baggrundsjob, og vores server ikke kan klare belastningen, kan vi nemt skalere vandret ved blot at tilføje ekstra forekomster af vores ansøgning. JobRunr deler belastningen automatisk og distribuerer alle job over de forskellige forekomster af vores ansøgning.

Den indeholder også en automatisk forsøgsfunktion med en eksponentiel back-off-politik for mislykkede job. Der er også en indbygget instrumentbræt det giver os mulighed for at overvåge alle job. JobRunr er selvvedligeholdende - vellykkede job slettes automatisk efter en konfigurerbar tid, så der ikke er behov for at udføre manuel oprydning.

4. Opsætning

Af hensyn til enkelheden bruger vi en datalager i hukommelsen til at gemme al jobrelateret information.

4.1. Maven-konfiguration

Lad os hoppe direkte til Java-koden. Men før det skal vi have følgende Maven-afhængighed erklæret i vores pom.xml fil:

 org.jobrunr jobrunr-spring-boot-starter 1.1.0 

4.2. Forårsintegration

Før vi hopper direkte til, hvordan vi opretter baggrundsjob, skal vi initialisere JobRunr. Som vi bruger jobrunr-spring-boot-starter afhængighed, det er let. Vi behøver kun at tilføje nogle egenskaber til application.properties:

org.jobrunr.background-job-server.enabled = sand org.jobrunr.dashboard.enabled = sand

Den første egenskab fortæller JobRunr, at vi vil starte en forekomst af en BaggrundJobServer der er ansvarlig for behandling af job. Den anden egenskab fortæller JobRunr at starte det integrerede dashboard.

Som standard er jobrunr-spring-boot-starter vil prøve at bruge din eksisterende Datakilde i tilfælde af en relationsdatabase til lagring af alle jobrelaterede oplysninger.

Men da vi bruger en datalager i hukommelsen, skal vi give en StorageProvider bønne:

@Bean offentlig StorageProvider storageProvider (JobMapper jobMapper) {InMemoryStorageProvider storageProvider = ny InMemoryStorageProvider (); storageProvider.setJobMapper (jobMapper); returner lagerProvider; }

5. Anvendelse

Lad os nu finde ud af, hvordan du opretter og planlægger baggrundsjob i foråret ved hjælp af JobRunr.

5.1. Injicer afhængigheder

Når vi vil skabe job, skal vi indsprøjte Jobplanlægning og vores eksisterende forårstjeneste, der indeholder metoden, som vi ønsker at skabe arbejdspladser til, i dette tilfælde, SampleJobService:

@Inject privat JobScheduler jobScheduler; @Injicer privat SampleJobService sampleJobService;

Det Jobplanlægning klasse fra JobRunr giver os mulighed for at starte eller planlægge nye baggrundsjob.

Det SampleJobService kunne være nogen af ​​vores eksisterende Spring-tjenester, der indeholder en metode, der kan tage for lang tid at håndtere i en webanmodning. Det kan også være en metode, der kalder nogle andre eksterne tjenester, hvor vi vil tilføje modstandsdygtighed, da JobRunr vil prøve metoden igen, hvis der opstår en undtagelse.

5.2. Oprettelse af brand-og-glemme job

Nu hvor vi har vores afhængigheder, kan vi oprette brand-og-glem job ved hjælp af enqueue metode:

jobScheduler.enqueue (() -> sampleJobService.executeSampleJob ());

Job kan have parametre, ligesom enhver anden lambda:

jobScheduler.enqueue (() -> sampleJobService.executeSampleJob ("nogle streng"));

Denne linje sørger for, at lambda - inklusive type, metode og argumenter - serieliseres som JSON til vedvarende lagring (en RDBMS som Oracle, Postgres, MySql og MariaDB eller en NoSQL-database).

En dedikeret medarbejderpulje af tråde, der kører i alle de forskellige BaggrundJobServers udfører derefter disse baggrundsjob i kø så hurtigt som muligt på en først-ind-først ud-måde. JobRunr garanterer udførelsen af ​​dit job af en enkelt medarbejder ved hjælp af optimistisk låsning.

5.3. Planlægning af job i fremtiden

Vi kan også planlægge job i fremtiden ved hjælp af tidsplan metode:

jobScheduler.schedule (() -> sampleJobService.executeSampleJob (), LocalDateTime.now (). plusHours (5));

5.4. Planlægning af job gentagne gange

Hvis vi vil have tilbagevendende job, skal vi bruge tidsplanI øjeblikket metode:

jobScheduler.scheduleRecurrently (() -> sampleJobService.executeSampleJob (), Cron.hourly ());

5.5. Kommenterer med @Job Kommentar

For at kontrollere alle aspekter af et job kan vi kommentere vores servicemetode med @Job kommentar. Dette gør det muligt at indstille displaynavnet i instrumentbrættet og konfigurere antallet af forsøg igen, hvis et job mislykkes.

@Job (name = "Eksempeljobbet med variablen% 0", prøver igen = 2) public void executeSampleJob (Strengvariabel) {...}

Vi kan endda bruge variabler, der sendes til vores job i displaynavnet ved hjælp af String.format () syntaks.

Hvis vi har meget specifikke brugstilfælde, hvor vi kun vil prøve et bestemt job igen med en bestemt undtagelse, kan vi skrive vores egne ElectStateFilter hvor vi har adgang til Job og fuld kontrol over, hvordan man fortsætter.

6. Dashboard

JobRunr leveres med et indbygget dashboard, der giver os mulighed for at overvåge vores job. Vi kan finde det på // localhost: 8000 og inspicere alle job, inklusive alle tilbagevendende job og et skøn over, hvor lang tid det vil tage, indtil alle de indkøbte job er behandlet:

Dårlige ting kan ske, for eksempel, et SSL-certifikat er udløbet, eller en disk er fuld. JobRunr vil som standard omlægge baggrundsjobbet med en eksponentiel back-off-politik. Hvis baggrundsjobbet fortsætter med at mislykkes ti gange, går det først til mislykkedes stat. Du kan derefter beslutte at sætte det mislykkede job i kø igen, når grundårsagen er løst.

Alt dette er synligt i instrumentbrættet, inklusive hvert forsøg igen med den nøjagtige fejlmeddelelse og det komplette stakspor af, hvorfor et job mislykkedes:

7. Konklusion

I denne artikel byggede vi vores første grundlæggende planlægning ved hjælp af JobRunr med jobrunr-spring-boot-starter. Nøgleudtagningen fra denne tutorial er, at vi var i stand til at oprette et job med kun en kodelinje og uden nogen XML-baseret konfiguration eller behovet for at implementere en grænseflade.

Den komplette kildekode til eksemplet er tilgængelig på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found