Spring Boot a Spring Batch – jednoduchý job

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]

Napsat komentář