Escolar Documentos
Profissional Documentos
Cultura Documentos
Spring Framework
Agenda
• Spring Batch
Spring Batch
O que é um batch?
“É um processo com quantidade delimitada
de dados sem interação ou interrupção”
Michael Minella
The Definitive Guide To Spring Batch
E Spring Batch?
“Um framework de batch leve e abrangente
para desenvolvimento de aplicações batch
robustas para o dia-a-dia dos sistemas
corporativos”
https://spring.io/projects/spring-batch
Spring Batch - Features
• Gerenciamento de transação
• Processamento Chunk
• Start/Stop/Restart
• Retry/Skip
https://spring.io/projects/spring-batch
Spring Batch
Spring Batch - Job
• É o processo completo
https://docs.spring.io/spring-batch/docs/current/reference/html/domain.html#job
Spring Batch
Spring Batch - Step
• Tasklet x Chunk
Spring Batch
Arquitetura
Spring Batch
https://www.toptal.com/
Spring Batch - Setup
• http://start.spring.io
• Configurar datasource
implementation 'com.h2database:h2:1.4.197'
spring:
datasource:
url: jdbc:h2:~/fiapmusicabatch;DB_CLOSE_ON_EXIT=FALSE
username: fiap
password: fiap
batch:
initialize-schema: always
Spring Batch
Spring Batch - Setup
@SpringBootApplication
@EnableBatchProcessing
Spring Batch
Step - Tasklet
• Interface
Spring Batch
Criar tasklet
@Bean
public Tasklet clearFiles(@Value("${file.local}") String path) {
return (stepContribution, chunkContext) -> {
File file = Paths.get(path).toFile();
if (file.delete()) {
logger.info("File deleted");
} else {
logger.info("Couldn't delete file");
}
return RepeatStatus.FINISHED;
};
}
Spring Batch
Criar Step
@Bean
@Scope("prototype")
public Step deleteStep(StepBuilderFactory stepBuilderFactory,
Tasklet tasklet){
return stepBuilderFactory.get("delete step")
.tasklet(tasklet)
.build();
}
Spring Batch
Criar Job
@Bean
public Job job(JobBuilderFactory
jobBuilderFactory,
Step step) {
return jobBuilderFactory.get("delete file")
.start(step)
.build();
}
Spring Batch
Step - Chunk
• Divide os dados em “chunks” menores para
processar
Spring Batch
Step - Chunk
Spring Batch
POJO
//getters e setters
Spring Batch
Schema
O Spring Batch busca por scripts no classpath
com a assinatura schema-##PLATAFORMA##.sql
Vamos criar o arquivo schema-all.sql como default
•
@Bean
public FlatFileItemReader<Pessoa> fileReader(@Value("${input.file}") Resource resource) {
return new FlatFileItemReaderBuilder<Pessoa>()
.name("read file")
.resource(resource)
.targetType(Pessoa.class)
.delimited().delimiter(";").names("nome", "cpf")
.build();
}
Spring Batch
Step - ItemProcessor
• Não obrigatório
• Lógica de negócio
@Bean
public ItemProcessor<Pessoa, Pessoa> processor() {
return pessoa -> {
pessoa.setNome(pessoa.getNome().toUpperCase());
pessoa.setCpf(pessoa.getCpf().replaceAll("\\.", "").replace("-", ""));
return pessoa;
};
}
Spring Batch
Step - ItemWriter
• Etapa de escrita dos dados
@Bean
public JdbcBatchItemWriter databaseWriter(DataSource datasource) {
return new JdbcBatchItemWriterBuilder<Pessoa>()
.dataSource(datasource)
.sql("insert into TB_PESSOA (NOME, CPF) values (:nome, :cpf)")
.beanMapped()
.build();
}
Spring Batch
Criação do Step Chunk
@Bean
public Step step(StepBuilderFactory stepBuilderFactory,
ItemReader<Pessoa> itemReader,
ItemWriter<Pessoa> itemWriter,
ItemProcessor<Pessoa, Pessoa> processor) {
return stepBuilderFactory.get("arquivo-bd")
.<Pessoa, Pessoa>chunk(100)
.reader(itemReader)
.processor(processor)
.writer(itemWriter)
.build();
}
Spring Batch
Criação do Job
@Bean
public Job job(JobBuilderFactory jobBuilderFactory,
Step step) {
return jobBuilderFactory.get("nomeDoJob")
.start(step)
.build();
}
Spring Batch
Teste
• Assíncrono - Awaytility
https://github.com/awaitility/awaitility
• Configuração de parâmetros
Spring Batch
Teste - Awaitylity
testImplementation 'org.awaitility:awaitility:4.0.3'
@Test
public void updatesCustomerStatus() {
// Publish an asynchronous message to a broker (e.g. RabbitMQ):
messageBroker.publishMessage(updateCustomerStatusMessage);
// Awaitility lets you wait until the asynchronous operation completes:
await().atMost(5, SECONDS).until(customerStatusIsUpdated());
...
}
Spring Batch
Teste - Configuration
@Configuration
public class BatchTestConfiguration {
@Bean
public JobLauncherTestUtils jobLauncherTestUtils() {
return new JobLauncherTestUtils();
}
}
Spring Batch
Teste - Application Class
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = {BatchApplication.class,
BatchTestConfiguration.class})
@SpringBootTest
public class BatchApplicationTests {
@Autowired
private JobLauncherTestUtils testUtils;
@Autowired
private Job job;
@Autowired
private DataSource dataSource;
Spring Batch
Teste - Configuration
@Test
public void testJob() throws Exception {
final JobExecution result = testUtils.getJobLauncher().run(job,
testUtils.getUniqueJobParameters());
assertNotNull(result);
assertEquals(BatchStatus.COMPLETED, result.getStatus());
await().atMost(10, SECONDS)
.until(() -> {
resultSet.last();
return resultSet.getInt(1) == 3;
});
assertEquals(3, resultSet.getInt(1) );
Spring Batch }
Pesquisa
https://fiap.me/Pesquisa-BBrasil-Development