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]