Utilizzando Primavera lotto 2.2.1, ho configurato un lavoro batch primavera, ho usato questo approccio:Primavera lotto: Tasklet con multi esecutore filettato ha pessime prestazioni legate alla Throttling algoritmo
configurazione è la seguente:
Tasklet utilizza ThreadPoolTaskExecutor limitata a 15 fili
strozzare-limite è pari al numero di fili
Chunk utilizzato con:
1 adattatore sincronizzato di JdbcCursorItemReader per consentirne l'uso da molti fili secondo Spring documentazione batch recommandation
È possibile sincronizzare la chiamata a read() e fintanto che l'elaborazione e la scrittura rappresentano la parte più costosa del blocco, il passaggio potrebbe comunque completare molto ter che in una configurazione a thread singolo.
saveState è falso su JdbcCursorItemReader
A Custom ItemWriter sulla base di JPA. Si noti che l'elaborazione di un elemento può variare in termini di tempo di elaborazione, può richiedere alcuni millisimi per alcuni secondi (> 60 secondi).
commit-intervallo impostato a 1 (lo so che potrebbe essere migliore, ma non è questo il problema)
Tutte le piscine JDBC vanno bene, per quanto riguarda primavera Lotto DOC recommandation
L'esecuzione del batch porta a risultati molto strani e cattivi a causa di:
- a un certo punto, se gli elementi richiedono un po 'di tempo per l'elaborazione da parte di uno scrittore, quasi tutti i thread nel pool di thread non eseguono nulla invece di elaborare, solo il writer lento funziona.
Guardando Codice del lotto Primavera, causa principale sembra essere in questo pacchetto:
- org/Spring Framework/batch/ripetizione/supporto/
È questo modo di lavorare una caratteristica o è una limitazione/bug?
Se si tratta di una funzione, in che modo la configurazione consente di rendere tutti i thread senza essere affamati da un lungo lavoro di elaborazione senza dover riscrivere tutto?
Si noti che se tutti gli elementi prendono allo stesso tempo, tutto funziona correttamente e il multi-threading è OK, ma se uno dei processi di elaborazione richiede molto più tempo, il multi-threading è quasi inutile per il tempo in cui il processo lento funziona .
Nota ho aperto questo problema:
Questo post è ottimo perché mostra l'esempio xml per configurare un passo partizionato, molto utile se non si ha a portata di mano il libro! – EdgeCaseBerg