En introduktion til Spring Cloud Task

1. Oversigt

Målet med Spring Cloud Task er at give funktionaliteten til at skabe kortvarige mikrotjenester til Spring Boot-applikation.

I Spring Cloud Task har vi fleksibiliteten til at køre enhver opgave dynamisk, tildele ressourcer efter behov og hente resultaterne efter opgavens afslutning.

Tasks er en ny primitiv inden for Spring Cloud Data Flow, der giver brugerne mulighed for at udføre stort set enhver Spring Boot-applikation som en kortvarig opgave.

2. Udvikling af en simpel opgaveapplikation

2.1. Tilføjelse af relevante afhængigheder

For at starte kan vi tilføje afhængighedsstyringsafsnit med spring-cloud-task-afhængigheder:

   org.springframework.cloud spring-cloud-task-dependencies 2.2.3.RELEASE pom import 

Denne afhængighedsstyring administrerer versioner af afhængigheder gennem importområdet.

Vi skal tilføje følgende afhængigheder:

 org.springframework.cloud spring-cloud-starter-task org.springframework.cloud spring-cloud-task-core 

Dette er linket til Maven Central of spring-cloud-task-core.

Nu har vi brug for at starte vores Spring Boot-applikation spring-boot-starter med den relevante forælder.

Vi skal bruge Spring Data JPA som et ORM-værktøj, så vi skal også tilføje afhængigheden af ​​det:

 org.springframework.boot spring-boot-starter-data-jpa 2.2.6.RELEASE 

Detaljerne om bootstrapping af en simpel Spring Boot-applikation med Spring Data JPA er tilgængelige her.

Vi kan kontrollere den nyeste version af spring-boot-starter-parent on Maven Central.

2.2. Det @EnableTask Kommentar

For at bootstrap funktionaliteten af ​​Spring Cloud Task skal vi tilføje @EnableTask kommentar:

@SpringBootApplication @EnableTask offentlig klasse TaskDemo {// ...} 

Annotationen bringer SimpleTaskConfiguration klasse på billedet, som igen registrerer TaskRepository og dens infrastruktur. Som standard bruges et kort i hukommelsen til at gemme status på TaskRepository.

De primære oplysninger om TaskRepository er modelleret i TaskExecution klasse. De bemærkede felter i denne klasse er opgavens navn, starttidspunkt, sluttid, exitMessage. Det exitMessage gemmer den tilgængelige information på udgangstidspunktet.

Hvis en udgang er forårsaget af en fejl under alle omstændigheder i applikationen, gemmes den fulde undtagelsestaksporing her.

Spring Boot giver en grænseflade ExitCodeExceptionMapper som kortlægger ufangede undtagelser fra udgangskoder, der muliggør gennemgået fejlfinding. Cloud Task gemmer informationen i datakilden til fremtidig analyse.

2.3. Konfiguration af en Datakilde til TaskRepository

Kortet i hukommelsen til at gemme TaskRepository forsvinder, når opgaven slutter, og vi mister data relateret til opgavehændelser. For at gemme i et permanent lager skal vi bruge MySQL som en datakilde med Spring Data JPA.

Datakilden er konfigureret i ansøgning.yml fil. For at konfigurere Spring Cloud Task til at bruge den angivne datakilde som lagring af TaskRepository, skal vi oprette en klasse, der strækker sig DefaultTaskConfigurer.

Nu kan vi sende konfigureret Datakilde som et konstruktørargument til superklassens konstruktør:

@Autowired privat DataSource dataSource; offentlig klasse HelloWorldTaskConfigurer udvider DefaultTaskConfigurer {offentlig HelloWorldTaskConfigurer (DataSource dataSource) {super (dataSource); }}

For at have ovenstående konfiguration i aktion skal vi kommentere en forekomst af Datakilde med @Autowired kommentar og indsprøjte instansen som konstruktør-argument for en HelloWorldTaskConfigurer ovenfor defineret bønne:

@Bean offentlig HelloWorldTaskConfigurer getTaskConfigurer () {returner ny HelloWorldTaskConfigurer (dataSource); }

Dette afslutter konfigurationen, der skal gemmes TaskRepository til MySQL-database.

2.4. Implementering

I Spring Boot, Vi kan udføre en hvilken som helst opgave lige før applikationen afslutter opstarten. Vi kan bruge ApplicationRunner eller CommandLineRunner grænseflader for at oprette en simpel opgave.

Vi er nødt til at gennemføre løb metode til disse grænseflader og erklære implementeringsklassen som en bønne:

@Komponent offentlig statisk klasse HelloWorldApplicationRunner implementerer ApplicationRunner {@Override public void run (ApplicationArguments arg0) kaster undtagelse {System.out.println ("Hello World from Spring Cloud Task!"); }}

Hvis vi kører vores applikation, skal vi nu få vores opgave til at producere den nødvendige output med de krævede tabeller oprettet i vores MySQL-database, der registrerer begivenhedsdataene for opgaven.

3. Livscyklus for en Spring Cloud Task

I starten opretter vi en post i TaskRepository. Dette er indikationen på, at alle bønner er klar til brug i applikationen og løb metoden til Runner-interface er klar til at blive udført.

Efter afslutningen af ​​udførelsen af løb metode eller i enhver fejl i ApplicationContext begivenhed, TaskRepository opdateres med en anden post.

I løbet af opgavens livscyklus kan vi registrere lyttere, der er tilgængelige fra TaskExecutionListener interface. Vi har brug for en klasse, der implementerer grænsefladen med tre metoder - onTaskEnd, onTaksFailed og onTaskStartup udløst i respektive begivenheder i opgaven.

Vi er nødt til at erklære bønnen fra implementeringsklassen i vores TaskDemo klasse:

@Bean offentlig TaskListener taskListener () {returner ny TaskListener (); }

4. Integration med Spring Batch

Vi kan udføre Spring Batch Job som en opgave og logge begivenheder i jobudførelsen ved hjælp af Spring Cloud Task. For at aktivere denne funktion skal vi tilføje Batchafhængigheder vedrørende Boot og Cloud:

 org.springframework.boot spring-boot-starter-batch org.springframework.cloud spring-cloud-task-batch 

Her er linket til Maven Central of spring-cloud-task-batch.

For at konfigurere et job som en opgave skal vi have Jobbønnen registreret i Jobkonfiguration klasse:

@Bean public Job job2 () {return jobBuilderFactory.get ("job2") .start (stepBuilderFactory.get ("job2step1") .tasklet (new Tasklet () {@Override public RepeatStatus execute (StepContribution bidrag, ChunkContext chunkContext) kaster undtagelse {System.out.println ("Dette job er fra Baeldung"); returner RepeatStatus.FINISHED;}}). Build ()). Build (); }

Vi er nødt til at dekorere TaskDemo klasse med @EnableBatchProcessing kommentar:

//..Andre bemærkninger .. @EnableBatchProcessing offentlig klasse TaskDemo {// ...}

Det @EnableBatchProcessing annotation muliggør Spring Batch-funktioner med en basiskonfiguration, der kræves for at opsætte batchjob.

Nu, hvis vi kører applikationen, @EnableBatchProcessing annotering udløser Spring Batch Job-udførelse, og Spring Cloud Task logger begivenhederne for udførelsen af ​​alle batchjobs med den anden Task, der udføres i springcloud database.

5. Start af en opgave fra Stream

Vi kan udløse opgaver fra Spring Cloud Stream. For at tjene dette formål har vi @EnableTaskLaucnher kommentar. Når vi først tilføjer kommentaren med Spring Boot-appen, vil en TaskSink være tilgængelig:

@SpringBootApplication @EnableTaskLauncher offentlig klasse StreamTaskSinkApplication {public static void main (String [] args) {SpringApplication.run (TaskSinkApplication.class, args); }}

Det TaskSink modtager beskeden fra en stream, der indeholder en GenericMessage indeholdende TaskLaunchRequest som en nyttelast. Derefter udløser den en opgavebaseret på koordinat, der er angivet i anmodningen om start af opgave.

At have TaskSink funktionel, kræver vi en konfigureret bønne, der implementerer TaskLauncher interface. Til testformål håner vi implementeringen her:

@Bean offentlig TaskLauncher taskLauncher () {return mock (TaskLauncher.class); }

Vi skal her bemærke, at TaskLauncher interface er kun tilgængelig efter tilføjelse af spring-cloud-deployer-local afhængighed:

 org.springframework.cloud spring-cloud-deployer-local 2.3.1.RELEASE 

Vi kan teste, om opgaven blev lanceret ved at påberåbe sig input af Håndvask grænseflade:

offentlig klasse StreamTaskSinkApplicationTests {@Autowired private Sink sink; //}

Nu opretter vi en forekomst af TaskLaunchRequest og send det som en nyttelast på GenericMessage objekt. Så kan vi påberåbe os input kanal af Håndvask holder GenericMessage objekt i kanalen.

6. Konklusion

I denne vejledning har vi undersøgt, hvordan Spring Cloud Task udfører, og hvordan vi konfigurerer den til at logge dens begivenheder i en database. Vi observerede også, hvordan Spring Batch-job defineres og gemmes i TaskRepository. Til sidst forklarede vi, hvordan vi kan udløse Task fra Spring Cloud Stream.

Som altid er koden tilgængelig på GitHub.


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