Você está na página 1de 34

TÍTULO DA APRESENTAÇÃO OU TÍTULO PRINCIPAL DO DOCUMENTO

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

• É compostos por um ou mais Steps

• Job -> Job Instance -> Job Execution

https://docs.spring.io/spring-batch/docs/current/reference/html/domain.html#job

Spring Batch
Spring Batch - Step

• Podem ser executados sequenciamento


ou em paralelo
• É a unidade de trabalho

• Tasklet x Chunk

• Step -> StepExecution


https://docs.spring.io/spring-batch/docs/current/reference/html/domain.html#step

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

public class BatchApplication

Spring Batch
Step - Tasklet

• Interface

• Uma tarefa única com múltiplos


passos

• Mais utilizado para “setup”

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

• Divide as responsabilidades em mais classes:

Spring Batch
Step - Chunk

Spring Batch
POJO

public class Pessoa {

private String nome;


private String cpf;

//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

drop table if exists TB_PESSOA;

create table TB_PESSOA(


id long not null auto_increment primary key,
nome varchar(255) not null,
cpf varchar (20) not null
)
Spring Batch
Step - ItemReader
• Etapa de leitura de dados

• FlatFileItemReader, JsonItemReader, JdbcCursorItemReader,


HibernateCursorItemReader, StaxEventItemReader, KafkaItemReader
ou CustomItemReader (Interface)


@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

• Assim como o ItemReader, existem diversos tipo e


também podem ser implementações customizadas

@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());

ResultSet resultSet = dataSource.getConnection()


.prepareStatement("select count(*) from TB_PESSOA;")
.executeQuery();

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

Spring Boot - Controller e REST API


OBRIGADO

Copyright © 2020 | Professor Fabio Tadashi Miyasato


Todos os direitos reservados. Reprodução ou divulgação total ou parcial deste documento, é expressamente
proibido sem consentimento formal, por escrito, do professor/autor.

Você também pode gostar