Image for post
Image for post

A Injeção de dependências é uma técnica que surgiu para resolver um problema comum no desenvolvimento de sistemas: o alto acoplamento. Para que você entenda o que é esse problema e porque é tão importante evitá-lo, vamos analisar um serviço de consulta de usuários:

Esse serviço realiza uma tarefa simples: ele consulta usuários em um arquivo. Um desenvolvedor menos experiente estaria bastante satisfeito com essa implementação, afinal, o serviço funciona. Mas, existem alguns problemas com essa abordagem.

Da forma como foi implementado, o serviço é capaz de buscar usuários apenas de um arquivo. Se for necessário modificar essa busca para consultar usuários de outra fonte de dados (do banco, por exemplo), toda a implementação deverá ser refeita. Eis aí que surge o famigerado acoplamento! Ele é uma medida de relacionamento entre componentes. Nessa situação, o acoplamento existe entre o serviço de consulta de usuários e a sua implementação de consulta em arquivo. …


Image for post
Image for post

Testes são cruciais para garantir que mudanças no software sejam feitas de forma mais segura e ágil. Quando falamos em testes de integração, estamos garantindo que as conexões entre as unidades de software funcionam adequadamente, e para o Spring Batch isso é essencial. Podemos testar jobs, steps, leitores, enfim, vários componentes do framework considerando a sua relevância na lógica de processamento. Para fazer isso, podemos utilizar o Spring Boot ao nosso favor, pois ele já fornece alguns componentes que visam facilitar esses testes.

Esse post é baseado principalmente neste livro, que contém as orientações mais atuais em 2019 sobre o uso do Spring Batch. …


Image for post
Image for post

Quando criamos sistemas batch, muitas vezes nos deparamos com uma lógica que é muito complexa para ser mantida num único job. Para resolver esse problema, poderíamos externalizar parte dessa lógica em outro job separando bem as responsabilidades e facilitando a manutenção do código. Mas como faríamos para invocar um job dentro do outro?

Uma alternativa seria utilizar o JobStep, que permite que configuremos um step responsável por invocar outro job:

Nesse exemplo, o jobStepJobStep1 invoca o job como se ele fosse um step! Essa solução é ideal para casos mais simples, quando precisamos apenas invocar um job dentro do outro uma única vez. …


Image for post
Image for post

Se você trabalha com Spring Batch, já deve ter se deparado com a dificuldade em definir o intervalo de commit de um job. Ou talvez você simplesmente utilize um valor padrão, mas se esse for o caso, você pode estar comprometendo o desempenho dos seus jobs e a sua capacidade de escalar.

Tendo isso em mente, qual seria o melhor intervalo de commit para um job? A resposta é: depende.

Existem vários pontos que você precisa considerar ao definir o intervalo de commit de um job. Dentre eles, destaco o tempo de execução, uso de memória, e capacidade de reinicialização do job. …


Image for post
Image for post

O Spring Batch é um framework robusto para a construção de jobs. Por ser basicamente uma máquina de estados, a base do seu funcionamento gira em torno do que chamamos de metadados. Esse artigo irá discutir o que são esses metadados e como utilizá-los para compreender o estado de um job Spring Batch.

JobRepository

Os metadados de um job descrevem o seu fluxo de execução completo. Eles incluem o histórico de execuções, falhas, número de escritas e leituras de registros, etc. Esses dados são armazenados num componente chamado JobRepository. O Spring Batch permite que esses dados sejam mantidos em memória ou salvos fisicamente numa base de dados. A escolha vai depender do propósito do job. Para estudos, a abordagem em memória é mais simples e sem grandes prejuízos. …


Image for post
Image for post

Quando o número de registros processados pelo job é muito grande, utilizar uma única thread pode não ser suficiente para atingir a janela de processamento definida. Pensando nisso, o Spring Batch provê algumas alternativas para escalar o job, que iremos discutir nesse post.

Abordagens numa única JVM

  • Step multithread: A ideia aqui é, tendo um chunk que possui um tamanho definido, processar esses chunks em paralelo dentro do step. Por exemplo, se houverem 10000 registros a serem processados e o chunk for de tamanho 100, eu vou precisar de 100 chunks para processar todos os registros. Nesse caso, podemos definir que serão usadas 3 threads para processar 3 chunks em paralelo. …


Image for post
Image for post

Validação é uma etapa importante no processamento batch. Ela pode ser utilizada para garantir a integridade do item lido para a etapa de escrita. O problema é quando temos uma lógica de validação complexa. Se o desenvolvedor não for muito experiente, ele pode implementar uma lógica com várias responsabilidades concentradas num único componente de processamento.

Felizmente, o Spring Batch provê um componente chamado CompositeItemProcessor, que permite encadear vários processadores, e assim manter as responsabilidades separadas entre eles.

Para entender como ele funciona, vamos pensar no cenário em que precisamos criar um job que realiza a leitura de um arquivo de clientes validando os atributos de cada cliente, além de verificar se o e-mail do cliente já foi confirmado no sistema. …


Image for post
Image for post

Ler arquivos é uma funcionalidade comum em sistemas batch. O Spring Batch disponibiliza implementações out-of-the-box para realizar essa tarefa, considerando os formatos mais comuns de arquivos: delimitados e de largura fixa.

O problema é que muitas vezes não temos o controle da geração do arquivo a ser lido, e por isso encontramos arquivos com formatos incomuns, como o do exemplo abaixo:

O arquivo possui uma lista de itens na mesma linha! Num cenário em que não é permitido modificar o conteúdo do arquivo para a leitura, utilizar o leitor padrão de arquivos delimitados do Spring Batch não seria suficiente, pois ele irá apenas dividir a linha quando encontrar uma vírgula, ele não sabe tratar o nosso formato de arquivo customizado. …


Image for post
Image for post

Você já precisou escrever dados em vários arquivos com o Spring Batch? Se sim, com certeza você já ouviu falar do componente MultiResourceItemWriter. Ele permite que escrevamos em vários arquivos utilizando uma configuração simples:

O código acima cria um arquivo por pessoa, informando o nome do arquivo estaticamente, através da configuração do recurso (resource). Tudo certo até aqui, mas e se precisarmos informar o nome dos arquivos dinamicamente?

Não dá para implementar isso apenas utilizando as configurações existentes no Spring Batch para o MultiResourceItemWriter. Precisamos customizar o comportamento de criação de recursos. …


Image for post
Image for post

Utilizar transações é algo essencial para garantir a integridade dos dados de um sistema. Imagina só um cenário em que um processamento de dados é interrompido pela metade? Se algum dado tiver sido salvo antes da interrupção, ele estará comprometido pois não houve o salvamento completo dos dados que deveriam ter sido processados!

About

Giuliana Bezerra

Software Architect at Dataprev — Instructor at Udemy

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store