Este projeto demonstra a implementação de um pipeline de processamento em lote robusto utilizando Spring Boot 3.5.3 e Spring Batch 5.2.2. A aplicação realiza a leitura de arquivos delimitados (CSV), trata conflitos de chaves primárias e persiste os registros de forma performática em um banco de dados em memória H2 Database, expondo o controle e métricas do ciclo de vida do Job através de uma API REST consumida por um Dashboard Front-end responsivo.
- Java: 17
- Framework Base: Spring Boot 3.5.3
- Mecanismo Batch: Spring Batch 5.2.2 (Migrado seguindo os novos padrões arquiteturais de injeção direta de repositórios)
- Banco de Dados: H2 Database (Engine em memória)
- Front-end: HTML5, JavaScript (Fetch API) e Tailwind CSS 4
- Gerenciador de Dependências: Maven 3
O projeto foi construído incrementalmente através de refatorações consecutivas no terminal Linux, passando pelos seguintes estágios:
- Migração para Spring Batch 5: Correção de erros críticos de compilação causados pela remoção das antigas classes
JobBuilderFactoryeStepBuilderFactory. - Criação da Infraestrutura de Inicialização: Implementação da classe principal
@SpringBootApplicationcom o métodomain, permitindo o empacotamento (repackage) correto via plugin Maven. - Configuração de Persistência Transacional: Integração do banco de dados H2 com scripts automáticos de DDL (
schema.sql) para a criação de tabelas operacionais do usuário e tabelas internas de metadados do Batch. - Arquitetura Baseada em Chunks: Transição de uma tarefa isolada (
Tasklet) para um fluxo segmentado de processamento em lote usandoFlatFileItemReadereJdbcBatchItemWriter. - Exposição Arquitetural REST: Criação de um desacoplamento do ciclo de vida de execução automática para um gatilho sob demanda (
spring.batch.job.enabled=false) acionado por requisições HTTP POST, retornando Telemetria e Métricas completas da execução em formato JSON estruturado. - Desenvolvimento do Front-end Interativo: Construção de uma interface web estática (
index.html) moderna para disparar o Job via interface gráfica e exibir os resultados em tempo real. - Resolução de Conflitos de Chave Primária (Resiliência): Substituição da instrução
INSERT INTOpela cláusulaMERGE INTO usuario KEY(id)do H2, garantindo idempotência e permitindo múltiplas execções do lote sem quebras porDuplicateKeyException(Padrão Upsert).
Abaixo está o mapeamento dos componentes gerados e configurados no ecossistema do projeto:
spring-batch-job/
├── pom.xml # Gerenciador de dependências Maven com Starter Web, Batch e H2
├── README.md # Documentação técnica do projeto
└── src/
└── main/
├── java/
│ └── com/
│ └── example/
│ └── batch/
│ ├── SpringBatchJobApplication.java # Classe Main de inicialização do Spring Boot
│ ├── Usuario.java # Entidade/Modelo de dados mapeada do CSV
│ ├── JobController.java # Controlador REST exposto para disparo do lote
│ ├── JobResponse.java # DTO para a resposta detalhada em JSON
│ └── job/
│ └── ImportJob.java # Configuração centralizada do Job, Steps e Beans
└── resources/
├── application.properties # Propriedades de conexão, console H2 e comportamento do lote
├── schema.sql # Script DDL de criação da tabela de banco de dados
├── usuarios.csv # Arquivo fonte de dados utilizado para processamento
└── static/
└── index.html # Dashboard Front-end para testes de disparo e telemetria
spring.datasource.url=jdbc:h2:mem:batchdb;DB_CLOSE_DELAY=-1
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.batch.jdbc.initialize-schema=always
spring.h2.console.enabled=true
spring.h2.console.path=/h2-console
spring.main.web-application-type=servlet
spring.batch.job.enabled=falseO gravador foi otimizado para evitar falhas ao reprocessar registros existentes na carga de dados:
@Bean
public JdbcBatchItemWriter<Usuario> usuarioWriter(DataSource dataSource) {
return new JdbcBatchItemWriterBuilder<Usuario>()
.itemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>())
// Utiliza o MERGE do H2 para atualizar caso o ID já exista (Evita DuplicateKeyException)
.sql("MERGE INTO usuario KEY(id) VALUES (:id, :nome, :email)")
.dataSource(dataSource)
.build();
}Rode o comando Maven para limpar compilações antigas e iniciar o servidor web integrado:
mvn clean spring-boot:runAbra o seu navegador e acesse:
👉 http://localhost:8080/
Clique no botão 🚀 Disparar Execução do Job. A interface exibirá as métricas coletadas de forma síncrona diretamente da resposta JSON do backend:
{
"idExecucao": 1,
"status": "COMPLETED",
"tempoGasto": "42 ms",
"itensLidos": 3
}Clique no botão do painel várias vezes consecutivas. Diferente do comportamento inicial do projeto, o status permanecerá sempre como COMPLETED devido à estratégia de MERGE configurada no banco de dados.
- Acesse:
http://localhost:8080/h2-console - Configure o campo JDBC URL exatamente como:
jdbc:h2:mem:batchdb - Clique em Connect e execute a seguinte consulta SQL:
SELECT * FROM usuario;Para salvar este projeto no seu perfil do GitHub, utilize a sequência de comandos abaixo no terminal da sua máquina local:
Antes de subir o projeto, garanta que arquivos desnecessários gerados pelo Maven (como a pasta /target) fiquem de fora do commit:
cat << 'EOF' > .gitignore
/target/
/.mvn/
.desktop
.pom.xml.tag
.releaseBackup
cobertura.ser
release.properties
pom.xml.releaseBackup
pom.xml.next
pom.xml.tag
pom.xml.rollback
### 2. Comandos Git de Versionamento e Push
Execute as instruções na pasta raiz do projeto para empurrar o código para a nuvem:
```bash
# Inicializa o repositório local
git init
# Adiciona todos os arquivos estruturados ao controle de versão
git add .
# Registra a foto atual do projeto com uma mensagem descritiva
git commit -m "feat: migração concluída para spring batch 5, api rest, front-end e merge idempotente"
# Cria/Renomeia a branch padrão para main
git branch -M main
# Associa o repositório local ao link do seu repositório remoto do GitHub
# (Substitua 'SEU_USUARIO' e 'NOME_DO_REPOSITORIO' pelos seus dados reais do GitHub)
git remote add origin https://github.com
# Envia os commits locais para o servidor remoto do GitHub
git push -u origin main