2011-10-03 4 views
5

Questa è la configurazione del passo. Il mio metodo skip listeners onSkipInWrite() viene chiamato correttamente. Ma onSkipInRead() non viene chiamato. Ho trovato questo gettando deliberatamente un'eccezione di puntatore nullo dal mio lettore.Spring Batch SkipListener non chiamato quando si verifica un'eccezione nel lettore

<step id="callService" next="writeUsersAndResources"> 
     <tasklet allow-start-if-complete="true"> 
      <chunk reader="Reader" writer="Writer" 
       commit-interval="10" skip-limit="10"> 
       <skippable-exception-classes> 
        <include class="java.lang.Exception" /> 
       </skippable-exception-classes> 
      </chunk> 
      <listeners> 
       <listener ref="skipListener" /> 
      </listeners> 
     </tasklet> 
    </step> 

Ho letto alcuni forum e scambiati gli ascoltatori-tag a entrambi i livelli: All'interno del pezzo, e al di fuori del tasklet. Nulla funziona ...

aggiungendo il mio salto Listener qui

package com.legal.batch.core; 

import org.apache.commons.lang.StringEscapeUtils; 
import org.springframework.batch.core.SkipListener; 
import org.springframework.jdbc.core.JdbcTemplate; 


public class SkipListener implements SkipListener<Object, Object> { 


    @Override 
    public void onSkipInProcess(Object arg0, Throwable arg1) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onSkipInRead(Throwable arg0) { 
    } 

    @Override 
    public void onSkipInWrite(Object arg0, Throwable arg1) { 
} 

} 

Gli esperti suggeriscono prega

+0

può voi anche posta la configurazione e l'implementazione del bean "skipListener"? Stai implementando l'interfaccia 'SkipListener '? Stai usando l'annotazione '@ OnSkipInRead'? ecc. – tolitius

+0

Aggiunto il listener skip qui – Shiv

risposta

8

Skip ascoltatori rispettano limite di transazione, il che significa che sono sempre chiamati poco prima che la transazione è impegnata.

Poiché un intervallo di commit nell'esempio è impostato su "10", il onSkipInRead verrà chiamato a destra al momento dell'impegno di questi 10 elementi (in una sola volta).

Quindi, se si tenta di eseguire un debug in modo graduale, non verrà visualizzato immediatamente un numero onSkipInRead dopo che un oggetto ItemReader ha generato un'eccezione.

Un SkipListener nell'esempio ha un metodo vuoto onSkipInRead. Prova ad aggiungere alcune registrazioni all'interno di onSkipInRead, sposta ae riesegui il tuo lavoro per vedere quei messaggi.

EDIT:

Ecco un esempio di lavoro [nomi sono cambiati a 'abc']:

<step id="abcStep" xmlns="http://www.springframework.org/schema/batch"> 
    <tasklet> 
     <chunk writer="abcWriter" 
       reader="abcReader" 
       commit-interval="${abc.commit.interval}" 
       skip-limit="1000" > 

      <skippable-exception-classes> 
       <include class="com.abc....persistence.mapping.exception.AbcMappingException"/> 
       <include class="org.springframework.batch.item.validator.ValidationException"/> 
       ... 
       <include class="...Exception"/> 
      </skippable-exception-classes> 

      <listeners> 
       <listener ref="abcSkipListener"/> 
      </listeners> 

     </chunk> 

     <listeners> 
      <listener ref="abcStepListener"/> 
      <listener ref="afterStepStatsListener"/> 
     </listeners> 

     <no-rollback-exception-classes> 
      <include class="com.abc....persistence.mapping.exception.AbcMappingException"/> 
      <include class="org.springframework.batch.item.validator.ValidationException"/> 
      ... 
      <include class="...Exception"/> 
     </no-rollback-exception-classes> 

     <transaction-attributes isolation="READ_COMMITTED" 
           propagation="REQUIRED"/> 
    </tasklet> 
</step> 

dove un fagiolo abcSkipListener è:

public class AbcSkipListener { 

    private static final Logger logger = LoggerFactory.getLogger("abc-skip-listener"); 

    @OnReadError 
    public void houstonWeHaveAProblemOnRead(Exception problem) { 
     // ... 
    } 


    @OnSkipInWrite 
    public void houstonWeHaveAProblemOnWrite(AbcHolder abcHolder, Throwable problem) { 
     // ... 
    } 

    .... 
} 
+0

Grazie. Ho avuto il codice sysout all'interno di onSkipInRead(). Inoltre sto lanciando una nuova nullPointerException dalla prima riga del mio lettore. Ho visto nel log che il limite di salto di 10 è stato superato e quindi mi aspettavo che il sysout del mio skip leggesse per la stampa. Ma non vederlo. Ho provato a mettere gli ascoltatori all'esterno del tasklet. Nessuna fortuna .. – Shiv

+1

ecco un esempio funzionante di uno dei miei progetti in passato. Prova a usare '@ OnReadError' in un ascoltatore di salto. – tolitius

+0

grazie. tornerà .. – Shiv

Problemi correlati