2014-10-30 14 views
5

In documentation di Spring Batch per la configurazione di un passo, un'immagine chiara descrive come viene eseguito il processo di lettura e scrittura.Documentazione Spring Batch sul passaggio orientato al chunk rispetto alla realtà?

read 
process 
... 
read 
process 
// until #amountOfReadsAndProcesses = commit interval 
write 

corrispondente (secondo il documento):

List items = new Arraylist(); 
for(int i = 0; i < commitInterval; i++){ 
    Object item = itemReader.read() 
    Object processedItem = itemProcessor.process(item); 
    items.add(processedItem); 
} 
itemWriter.write(items); 

Tuttavia quando il debug e mettere un punto di interruzione nel metodo di lettura del lettore e un punto di interruzione nel metodo processo del processore vedo la comportamento seguente:

Quindi la documentazione è errata? O mi manca qualche configurazione per farlo comportarsi come la documentazione (non ho trovato nulla lì).

Il problema che ho è che ogni lettura consequetive ora dipende da uno stato dal processore. Il lettore è un composto che legge due sorgenti in parallelo, a seconda degli elementi letti in una delle fonti, solo la prima, la seconda o entrambe le fonti vengono lette durante un'operazione di lettura. Ma lo stato di quali fonti leggere è fatto nel processore. Attualmente l'unica soluzione sta per commit-interval 1, che non è molto ottimale per le prestazioni.

+0

si potrebbe provare con un lettore personalizzato che avvolge il lettore di serie e la logica –

+0

vostra abitudine Sì ho pensato a questo, ma la sua non è in linea con il modello di un lotto. Il lettore non è responsabile di creare un output. – Juru

+0

lo proverei con le tabelle di database per le origini (importazione con primo lotto) e leggere i dati con un SQL corretto (secondo lotto per l'elaborazione aziendale) –

risposta

3

La risposta breve è, sei corretto, la nostra documentazione non è precisa sul modello di chunking. È qualcosa che deve essere aggiornato. Ci sono dei motivi per cui è così com'è (hanno principalmente a che fare con la gestione della fault tolerance). Ma questo non risolve il problema. Per il vostro caso d'uso, ci sono un paio di opzioni:

  • Configurare il lavoro utilizzando la configurazione JSR-352 - Il modello di elaborazione per la JSR-352 è quello che dice la nostra documentazione (hanno preso per oro colato invece di quello Primavera Batch fa davvero). Poiché Spring Batch supporta JSR-352, cambiando semplicemente la configurazione e il modo in cui si avvia il lavoro, si ottengono gli stessi risultati. Esistono limitazioni di JSR-352 che non rientrano nell'ambito di questa discussione, ma è un'opzione.
  • Un'altra opzione sarebbe quella di fare ciò che suggerisce Michael Pralow - Pur comprendendo le tue preoccupazioni sulla separazione delle preoccupazioni, sembra che tu stia già infrangendo questa regola dato che il tuo processore sta generando output di cui il lettore ha bisogno (o sei tu condividendo quello stato in qualche altro modo?).
  • Altre opzioni - Senza saperne di più sul tuo lavoro, ci potrebbero essere altri modi per strutturare il tuo lavoro che funziona bene (cose come lo spostamento della logica in più passaggi, ecc.) E comunque ottenere la separazione delle preoccupazioni che Spring Batch cerca di consentire ma dovrei vedere più della tua configurazione per poterti aiutare.
+0

Per l'opzione due. Sì, esiste uno stato all'interno del contesto di esecuzione del passaggio. Non è l'output del processore che viene utilizzato. – Juru

+0

Come posso condividere la mia configurazione di lavoro? Non è realmente correlato a questo problema. – Juru

+0

Creare un nuovo argomento che chiede come indirizzare la gestione dello stato tra un processore e un lettore in Spring Batch. –

Problemi correlati