Bakgrunnsjobber om våren med JobRunr

1. Oversikt

I denne veiledningen skal vi se på distribuert bakgrunnsjobbplanlegging og prosessering i Java ved hjelp av JobRunr og få den integrert med Spring.

2. Om JobRunr

JobRunr er et bibliotek som vi kan legge inn i applikasjonen vår, og som lar oss planlegge bakgrunnsjobber ved hjelp av en Java 8 lambda. Vi kan bruke en hvilken som helst eksisterende metode for vårtjenestene for å opprette en jobb uten å måtte implementere et grensesnitt. En jobb kan være en kort eller langvarig prosess, og den blir automatisk lastet ned til en bakgrunnstråd slik at den gjeldende nettforespørselen ikke blir blokkert.

For å gjøre jobben sin, analyserer JobRunr Java 8 lambda. Den serialiseres som JSON, og lagrer den i enten en relasjonsdatabase eller en NoSQL-datalager.

3. JobRunr-funksjoner

Hvis vi ser at vi produserer for mange bakgrunnsjobber og serveren vår ikke kan takle belastningen, kan vi enkelt skalere horisontalt ved å bare legge til ekstra forekomster av applikasjonen vår. JobRunr vil dele belastningen automatisk og distribuere alle jobber over de forskjellige forekomster av applikasjonen vår.

Den inneholder også en automatisk forsøk på nytt med en eksponentiell back-off-policy for mislykkede jobber. Det er også en innebygd dashbord som lar oss overvåke alle jobber. JobRunr er selvopprettholdende - vellykkede jobber slettes automatisk etter en konfigurerbar tid, så det er ikke nødvendig å utføre manuell opprydding av lagring.

4. Oppsett

For enkelhets skyld vil vi bruke en datalager i minnet til å lagre all jobbrelatert informasjon.

4.1. Maven-konfigurasjon

La oss hoppe rett til Java-koden. Men før det må vi få følgende Maven-avhengighet erklært i vår pom.xml fil:

 org.jobrunr jobrunr-spring-boot-starter 1.1.0 

4.2. Vårintegrasjon

Før vi hopper rett på hvordan du oppretter bakgrunnsjobber, må vi initialisere JobRunr. Når vi bruker jobrunr-spring-boot-starter avhengighet, dette er enkelt. Vi trenger bare å legge til noen egenskaper i application.properties:

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

Den første egenskapen forteller JobRunr at vi vil starte en forekomst av en BakgrunnJobServer som er ansvarlig for behandling av jobber. Den andre egenskapen forteller JobRunr å starte det innebygde dashbordet.

Som standard er jobrunr-spring-boot-starter vil prøve å bruke din eksisterende Datakilde i tilfelle en relasjonsdatabase for å lagre all jobbrelatert informasjon.

Siden vi bruker en datalager i minnet, må vi imidlertid oppgi en StorageProvider bønne:

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

5. Bruk

La oss nå finne ut hvordan du oppretter og planlegger bakgrunnsjobber om våren ved hjelp av JobRunr.

5.1. Injiser avhengigheter

Når vi ønsker å skape jobber, må vi injisere JobScheduler og vår eksisterende vårtjeneste som inneholder metoden som vi ønsker å skape arbeidsplasser for, i dette tilfellet, SampleJobService:

@Inject private JobScheduler jobScheduler; @Injiser privat SampleJobService sampleJobService;

De JobScheduler klasse fra JobRunr tillater oss å innhente eller planlegge nye bakgrunnsjobber.

De SampleJobService kan være noen av våre eksisterende vårtjenester som inneholder en metode som det kan ta for lang tid å håndtere i en nettforespørsel. Det kan også være en metode som kaller noen andre eksterne tjenester der vi vil legge til motstandsdyktighet, ettersom JobRunr vil prøve metoden på nytt hvis et unntak oppstår.

5.2. Opprette brann-og-glem jobber

Nå som vi har våre avhengigheter, kan vi opprette brann-og-glem jobber ved hjelp av enqueue metode:

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

Jobber kan ha parametere, akkurat som alle andre lambda:

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

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

En dedikert arbeiderpool av tråder som kjører i alle forskjellige BakgrunnJobServers vil deretter utføre disse bakgrunnsjobbene i kø så snart som mulig, på en først-inn-først-ut måte. JobRunr garanterer utførelsen av jobben din av en enkelt arbeider ved hjelp av optimistisk låsing.

5.3. Planlegge jobber i fremtiden

Vi kan også planlegge jobber i fremtiden ved hjelp av rute metode:

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

5.4. Planlegge jobber gjentatte ganger

Hvis vi vil ha tilbakevendende jobber, må vi bruke tidsplanNå metode:

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

5.5. Kommenterer med @Jobb Kommentar

For å kontrollere alle aspekter av en jobb, kan vi kommentere tjenestemetoden vår med @Jobb kommentar. Dette gjør det mulig å angi visningsnavnet i dashbordet og konfigurere antall prøver på nytt hvis en jobb mislykkes.

@Job (name = "Eksempeljobben med variabelen% 0", prøver på nytt = 2) public void executeSampleJob (Strengvariabel) {...}

Vi kan til og med bruke variabler som sendes til jobben vår i visningsnavnet ved hjelp av String.format () syntaks.

Hvis vi har veldig spesifikke bruksområder der vi bare vil prøve en bestemt jobb med et bestemt unntak, kan vi skrive våre egne ElectStateFilter der vi har tilgang til Jobb og full kontroll på hvordan du skal gå frem.

6. Dashbord

JobRunr kommer med et innebygd dashbord som lar oss overvåke jobbene våre. Vi kan finne den på // localhost: 8000 og inspisere alle jobbene, inkludert alle tilbakevendende jobber og en estimering av hvor lang tid det vil ta til alle etterfølgende jobber er behandlet:

Dårlige ting kan skje, for eksempel, et SSL-sertifikat er utløpt, eller en disk er full. JobRunr vil som standard omstille bakgrunnsjobben med en eksponentiell back-off-policy. Hvis bakgrunnsjobben fortsetter å mislykkes ti ganger, bare da vil den gå til Mislyktes stat. Du kan deretter bestemme deg for å kjøre den mislykkede jobben på nytt når grunnårsaken er løst.

Alt dette er synlig i dashbordet, inkludert hvert nytt forsøk med den nøyaktige feilmeldingen og det komplette stakkesporet av hvorfor en jobb mislyktes:

7. Konklusjon

I denne artikkelen bygde vi vår første grunnleggende planlegger ved hjelp av JobRunr med jobrunr-spring-boot-starter. Den viktigste takeawayen fra denne opplæringen er at vi klarte å lage en jobb med bare en kodelinje og uten noen XML-basert konfigurasjon eller behovet for å implementere et grensesnitt.

Den komplette kildekoden for eksemplet er tilgjengelig på GitHub.


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