2015-12-23 21 views
5

Ho un lavoro batch di primavera che legge alcuni file e lo persiste in DB. Se devo essere in grado di codificare alcune condizioni personalizzate e saltare l'elaborazione dei file se non soddisfa la condizione. Ho cercato di estendere ItemReader e generare un'eccezione, ma ha causato l'intero processo fallire mentre ho bisogno che il lavoro continui a scorrere i file.batch di primavera come saltare l'intero file a condizione

Grazie

+0

Parte del codice potrebbe essere d'aiuto. – Kenneth

risposta

2

Così ho finito per estendere MultiResourceItemReader e sovrascrivere il metodo read(). Prima di delegare il file a ItemReader effettivo, convalida la condizione e passa il file al lettore solo nel caso in cui la condizione sia passata, altrimenti l'elaborazione al file successivo

3

Date un'occhiata all'interfaccia org.springframework.batch.core.step.skip.SkipPolicy. Vi do un esempio estratto da Pro Spring Batch written by T. Minella

import java.io.FileNotFoundException; 
import org.springframework.batch.core.step.skip.SkipLimitExceededException; 
import org.springframework.batch.core.step.skip.SkipPolicy; 
import org.springframework.batch.item.ParseException; 

public class FileVerificationSkipper implements SkipPolicy { 

public boolean shouldSkip(Throwable exception, int skipCount) throws SkipLimitExceededException { 

if(exception instanceof FileNotFoundException) { 
     return false; 
} else if(exception instanceof ParseException && skipCount <= 10) { 
     return true; 
} else { 
     return false; 
    } 
    } 
} 

Dentro il file xml:

<step id="copyFileStep"> 
    <tasklet> 
    <chunk reader="customerItemReader" writer="outputWriter" 
commit-interval="10" skip-limit="10"> 
     <skippable-exception-classes> 
     <include class="java.lang.Exception"/> 
     <exclude class="org.springframework.batch.item.ParseException"/> 
     </skippable-exception-classes> 
    </chunk> 
    </tasklet> 
</step> 

O forse un altro modo potrebbe essere quella di aggiungere all'inizio del tuo lavoro un passo wich ordinare i file di input in due cartella separata. All'interno di una cartella avrai tutti i file sbagliati e all'interno dell'altra cartella rimarranno solo quelli buoni.

+0

SkipPolicy opera a livello di blocco mentre devo operare a livello di file quindi suppongo che questo non sia il modo –

+0

Forse un altro modo potrebbe essere quello di aggiungere all'inizio del tuo lavoro un passaggio che ordina i tuoi file di input in due cartelle separate. All'interno di una cartella avrai tutti i file sbagliati e all'interno dell'altra cartella rimarranno solo quelli buoni. – Aurelien

+0

Grazie per il tuo commento. Ho aggiunto la risposta con la soluzione che sono riuscito a ottenere. –

1

sostituisce il metodo doRead() del lettore e genera l'eccezione specifica dell'app. es:

*CustomFlatFileItemReader 
    @Override 
    protected T doRead() throws Exception { 
     T itemRead=null; 
     try { 
      itemRead= super.doRead(); 
     } catch (FlatFileParseException e) { 
      throw new MyException(e.getMessage(), e); 
     } 
    return itemRead; 
}* 

2. Impostare la skipPolicy del lavoro per saltare MyException.

*.skipPolicy((Throwable T, int skipCount) -> { 
        if (T instanceof MyException) 
         return true; 
        else 
         return false; 
       }*