V tomto příspěvku budeme pokračovat v tomto projektu. Aktuálně máme prázdny projekt v Eclipse IDE, který lze spustil. Přidáme si do něj jednoduchý job, který bude mazat soubor. Pro definování nových tříd (beans) použijeme java configuraci.
BeanConfig.java
import org.springframework.batch.core.Job; import org.springframework.batch.core.Step; import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing; import org.springframework.batch.core.configuration.annotation.JobBuilderFactory; import org.springframework.batch.core.configuration.annotation.StepBuilderFactory; import org.springframework.batch.core.step.tasklet.Tasklet; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import cz.vitfo.batch.processing.DeleteFileTasklet; @Configuration @EnableBatchProcessing @ComponentScan("cz.vitfo") public class BeanConfig { @Autowired private JobBuilderFactory jobBuilderFactory; @Autowired private StepBuilderFactory stepBuilderFactory; @Autowired private DeleteFileTasklet deleteFileTasklet; @Bean public Job myJob() { return jobBuilderFactory.get("myJob") .start(deleteFileFromDirectoryStep()) .build(); } @Bean public Step deleteFileFromDirectoryStep() { return stepBuilderFactory.get("deleteFileFromDirectoryStep") .tasklet(deleteFileFromDirectoryTasklet()) .build(); } @Bean public Tasklet deleteFileFromDirectoryTasklet() { return deleteFileTasklet; } }
- Anotace @Configuration označuje tuto třídu jako tu, která obsahuje jednu nebo více anotací @Bean. Pokud na tuto anotaci Spring narazí, vytvoří beanu (třídu) dle definice. Zkráceně řečeno anotace @Configuration označuje třídu, kde se nachází konfigurace.
- Anotace @EnableBatchProcessing za nás vytvoří a inicializuje beany (třídy) jako například JobBuilderFactory nebo StepBuilderFactory, které budeme používat pro vytvoření jobu.
- Anotace @ComponentScan říká Springu, kde má hledat třídy, ze kterých má vytvořit beany. Spring pak prochází zadanou cestu a hledá třídy s anotacemi.
Dále si vytvoříme třídu s taskletem.
DeleteFileTasklet.java
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.batch.core.StepContribution; import org.springframework.batch.core.scope.context.ChunkContext; import org.springframework.batch.core.step.tasklet.Tasklet; import org.springframework.batch.repeat.RepeatStatus; import org.springframework.stereotype.Component; @Component public class DeleteFileTasklet implements Tasklet { private static Logger logger = LoggerFactory.getLogger(DeleteFileTasklet.class); @Override public RepeatStatus execute(StepContribution arg0, ChunkContext arg1) throws Exception { File output = new File("output.txt"); if (output.exists()) { logger.info("deleting output file"); final boolean deleted = output.delete(); if (!deleted) { logger.warn("file wasn't deleted"); } } else { logger.info("file not found"); } return null; } }
Anotace @Component označuje třídu, která představuje nějakou komponetu, třídu, ze které se má vytvořit beana.
Pomocí JobBuilderFactory
si vytvoříme job s názvem „myJob“. Náš job se bude skládat z jediného kroku (step), který vytvoříme pomocí StepBuilderFactory
. Jak JobBuilderFactory
tak StepBuilderFactory
máme připravenou k použití díky anotaci @EnableBatchProcessing
. Náš krok (step) má název „deleteFileFromDirectoryStep“ a obsahuje náš tasklet. Díky anotaci @Autowired
Spring při startu aplikace prošel umístění určená anotací @CompoenetScan
a vytvořil příslušné objekty, v našem případě našel a inicializovat objekt typu DeleteFromDirectoryStep
(díky tomu, že má anotaci @Component
). Náš tasklet předáme StepBuilderFactory
, která vytvoří step.
Pokud nyní projekt spustíte, měli byste dostat následující výstup do konzole:
Job: [SimpleJob: [name=myJob]] launched with the following parameters: [{-spring.output.ansi.enabled=always}] Executing step: [deleteFileFromDirectoryStep] file not found Job: [SimpleJob: [name=myJob]] completed with the following parameters: [{-spring.output.ansi.enabled=always}] and the following status: [COMPLETED]