2025-09-10 12:36:58 +02:00
2025-09-10 12:29:14 +02:00
2025-09-10 09:55:26 +02:00
2025-09-09 10:55:07 +02:00
2025-09-09 10:55:07 +02:00
2025-09-10 12:36:58 +02:00
2025-09-10 09:55:26 +02:00

Spring Boot Batch Demo

Un'applicazione Spring Boot Batch che gestisce l'elaborazione dati tra due database SQL Server:

  • C6StampeCentralizzate: database principale
  • SEIReport: database secondario per reporting

Requisiti

  • Java 21
  • Maven
  • SQL Server

Struttura del Progetto

src/main/java/com/armundia/bulk/
├── BatchApplication.java          # Classe principale dell'applicazione
└── config/
    ├── CopiaTabelleJobConfig.java # Configurazione del batch job
    └── DataSourceConfig.java      # Configurazione dei datasource

Configurazione

Il progetto utilizza:

  • Spring Boot 3.3.13
  • Spring Batch 5.1.3
  • SQL Server per il job repository

Branch

  • master: versione stabile per Java 8
  • jdk11: versione migrata a Java 11 con Spring Boot 2.7.x

Database

La configurazione del database utilizza Hikari connection pool e richiede:

  1. Database principale (C6StampeCentralizzate):

    jdbc:sqlserver://localhost;databaseName=C6StampeCentralizzate
    User: F701264
    Password: centrsei
    
  2. Database reporting (SEIReport):

    jdbc:sqlserver://localhost;databaseName=SEIReport
    User: F701264
    Password: centrsei
    

Spring Batch Schema

Il progetto include uno schema SQL Server personalizzato (schema-sqlserver.sql) che crea:

  • Tabelle: BATCH_JOB_INSTANCE, BATCH_JOB_EXECUTION, BATCH_JOB_EXECUTION_PARAMS, etc.
  • Sequenze necessarie per il job repository

Come Eseguire

Due modalità di esecuzione disponibili:

  1. Usando build.bat:

    build.bat compile   # Compila il progetto
    build.bat run      # Esegue l'applicazione
    
  2. Usando Maven direttamente:

    mvn spring-boot:run -Dspring-boot.run.arguments="--spring.batch.job.names=copiaTabelleJob"
    

Job Disponibili

  • copiaTabelleJob: Job principale che gestisce la copia di tabelle tra i due database SQL Server
  • copiaDaSelectJob: Job che esegue una query SELECT e copia i risultati in una tabella di output

Dettagli Implementazione

copiaTabelleJob

  • Il job (copiaTabelleJob) contiene un step principale:
    1. copiaTabelleStep: copia le tabelle specificate dai parametri del job dal database sorgente a quello di destinazione

copiaDaSelectJob

  • Il job (copiaDaSelectJob) contiene un step principale:
    1. copiaDaSelectStep: esegue una query SELECT personalizzata e copia i risultati in una tabella di output specificata

Gestione delle Dipendenze

L'applicazione utilizza l'iniezione delle dipendenze di Spring per gestire i JdbcTemplate:

@Configuration
public class DataSourceConfig {
    @Bean(name = "inputJdbcTemplate")
    public JdbcTemplate inputJdbcTemplate(DataSource inputDataSource) {
        return new JdbcTemplate(inputDataSource);
    }
    
    @Bean(name = "outputJdbcTemplate")
    public JdbcTemplate outputJdbcTemplate(DataSource outputDataSource) {
        return new JdbcTemplate(outputDataSource);
    }
}

@Configuration
public class CopiaTabelleJobConfig {
    public CopiaTabelleJobConfig(
        @Qualifier("outputJdbcTemplate") JdbcTemplate outputJdbcTemplate,
        @Qualifier("inputJdbcTemplate") JdbcTemplate inputJdbcTemplate) {
        // Configurazione del job di copia tabelle
    }
}

Spring risolve le dipendenze utilizzando i @Qualifier per distinguere tra i diversi JdbcTemplate.

Flusso dell'Applicazione

  1. L'applicazione parte da BatchApplication (classe principale con @SpringBootApplication)
  2. Spring Boot esegue la scansione del package com.armundia.bulk e trova:
    • CopiaTabelleJobConfig (annotata con @Configuration)
    • Crea automaticamente i bean definiti in CopiaTabelleJobConfig
  3. Il job copiaTabelleJob può essere eseguito tramite parametri o interfaccia web

Comandi di Esecuzione

Il progetto include uno script build.bat che semplifica la compilazione e l'esecuzione:

Compilazione

.\build.bat compile

Esecuzione Job Batch

# Esecuzione senza job automatici (configurazione predefinita)
.\build.bat run

# Esecuzione con job specifico in modalità debug
.\build.bat debug

Monitor Grafici

# Monitor GUI (Swing Desktop)
.\build.bat monitor-gui

# Monitor Web: avvia l'app e vai su http://localhost:8080
.\build.bat run

Sistema di Monitoraggio

Monitor Web (HTML) - RACCOMANDATO

Avvio:

  1. Esegui .\.build.bat run
  2. Apri il browser su http://localhost:8080

Funzionalità:

  • Interfaccia web moderna con design responsive
  • Tabella dinamica con dettagli completi dei job batch
  • Auto-refresh ON/OFF configurabile
  • Aggiornamento manuale con pulsante dedicato
  • Avvio job batch direttamente dall'interfaccia
  • Gestione errori con messaggi informativi
  • Formattazione automatica di date e stati
  • Colori per gli stati (verde=completato, rosso=fallito, blu=in esecuzione)

Sezione Avvio Job:

  • Pulsanti dinamici per tutti i job disponibili
  • Conferma prima dell'avvio
  • Feedback in tempo reale
  • Aggiornamento automatico dopo l'avvio

Monitor GUI (Swing Desktop)

Avvio:

.\build.bat monitor-gui

Funzionalità:

  • Interfaccia desktop Java Swing
  • Auto-refresh ON/OFF toggle
  • Aggiornamento manuale
  • Tabella con dettagli job

API Endpoints

L'applicazione espone i seguenti endpoint REST:

Monitoraggio Job

GET /api/batch/jobs

Restituisce la lista delle esecuzioni job con dettagli completi.

Elenco Job Disponibili

GET /api/batch/available-jobs

Restituisce la lista dei job batch disponibili per l'avvio.

Avvio Job

POST /api/batch/launch/{jobName}

Avvia un job batch specifico. Parametri automatici:

  • timestamp: timestamp di avvio
  • launchedBy: "monitor"
  • tabelle: elenco delle tabelle da copiare (opzionale, default: "C6Mart.SPB_W6CatESG,C6Mart.W6CLIESG")

Esempio di risposta:

{
  "status": "success",
  "message": "Job 'copiaTabelleJob' avviato con successo",
  "executionId": 123,
  "jobStatus": "STARTING"
}

Configurazione Avanzata

Disabilitazione Auto-Start Job

Per impostazione predefinita, i job non si avviano automaticamente:

# In application.properties
spring.batch.job.enabled=false

Configurazione Actuator

Gli endpoint di monitoraggio sono abilitati tramite:

# Endpoint Actuator per il monitoraggio
management.endpoints.web.exposure.include=health,info,batch
management.endpoint.batch.enabled=true
management.endpoints.web.base-path=/api

Database Job Repository

L'applicazione utilizza SQL Server per il job repository con tabelle personalizzate:

spring.sql.init.mode=always
spring.sql.init.schema-locations=classpath:schema-sqlserver.sql
spring.batch.jdbc.initialize-schema=never

Descrizione Job Disponibili

I job batch configurati nell'applicazione:

  1. copiaTabelleJob - Job principale di copia tabelle

    • Parametri:
      • tabelle (opzionale): elenco delle tabelle da copiare, separate da virgola (default: "C6Mart.SPB_W6CatESG,C6Mart.W6CLIESG")
      • inputConnection (opzionale): ID della connessione di input personalizzata
      • outputConnection (opzionale): ID della connessione di output personalizzata
  2. copiaDaSelectJob - Job di copia da query SELECT personalizzata

    • Parametri obbligatori:
      • selectQuery: query SELECT da eseguire sul database di input
      • outputTable: nome della tabella di destinazione dove copiare i risultati
    • Parametri opzionali:
      • inputConnection: ID della connessione di input personalizzata
      • outputConnection: ID della connessione di output personalizzata

Risoluzione Problemi

Job Non Partono Automaticamente

Comportamento Corretto - I job sono configurati per non partire automaticamente.

Log e Debug

I log sono configurati per fornire informazioni dettagliate:

logging.level.com.armundia.bulk=TRACE
logging.level.org.springframework.batch=INFO

Per debug avanzato, usa:

.\build.bat debug

## Tabelle copiate

C6mart.VCONTRATTI              83.252
C6mart.CONTRATTOSEI_METADATI  109.470
C6Mart.SPB_W6CatESG                45
C6mart.W6CLIESG                     3
Description
No description provided
Readme 200 KiB
Languages
Java 57.5%
HTML 38.4%
TSQL 2.7%
Batchfile 1.4%