Skip to content

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

0 watching

Forks

Latest commit

 

History

6 Commits

Folders and files

Repository files navigation

Spring Batch 5 Job - CSV Importer API & Dashboard 🚀

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.


🛠️ Tecnologias e Versões Utilizadas

  • 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

📈 Linha do Tempo da Evolução do Projeto

O projeto foi construído incrementalmente através de refatorações consecutivas no terminal Linux, passando pelos seguintes estágios:

  1. Migração para Spring Batch 5: Correção de erros críticos de compilação causados pela remoção das antigas classes JobBuilderFactory e StepBuilderFactory.
  2. Criação da Infraestrutura de Inicialização: Implementação da classe principal @SpringBootApplication com o método main, permitindo o empacotamento (repackage) correto via plugin Maven.
  3. 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.
  4. Arquitetura Baseada em Chunks: Transição de uma tarefa isolada (Tasklet) para um fluxo segmentado de processamento em lote usando FlatFileItemReader e JdbcBatchItemWriter.
  5. 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.
  6. 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.
  7. Resolução de Conflitos de Chave Primária (Resiliência): Substituição da instrução INSERT INTO pela cláusula MERGE INTO usuario KEY(id) do H2, garantindo idempotência e permitindo múltiplas execções do lote sem quebras por DuplicateKeyException (Padrão Upsert).

📁 Estrutura de Arquivos Atualizada

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

🖥️ Configuração dos Arquivos Principais

Configurações de Ambiente (src/main/resources/application.properties)

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=false

Mecanismo de Idempotência (src/main/java/com/example/batch/job/ImportJob.java)

O 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();
}

🚀 Como Executar e Testar Localmente

1. Iniciar a Aplicação

Rode o comando Maven para limpar compilações antigas e iniciar o servidor web integrado:

mvn clean spring-boot:run

2. Acessar o Dashboard de Testes

Abra 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
}

3. Validar a Idempotência (Multi-disparos)

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.

4. Consultar os Dados no Console Gráfico do H2

  1. Acesse: http://localhost:8080/h2-console
  2. Configure o campo JDBC URL exatamente como: jdbc:h2:mem:batchdb
  3. Clique em Connect e execute a seguinte consulta SQL:
SELECT * FROM usuario;

📌 Fluxo de Publicação no GitHub

Para salvar este projeto no seu perfil do GitHub, utilize a sequência de comandos abaixo no terminal da sua máquina local:

1. Configurar Filtros do Repositório (Evitar arquivos temporários)

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

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages