2013-07-16 14 views
5

Im utilizzando il nucleo di rilascio SpringBatch 2.1.7 e i barattoli dell'infrastruttura per leggere un file CSV e salvarlo nel DB.Tentativo di aggiornare l'esecuzione passo id = 1 con la versione errata (2), dove la versione corrente è 1

Integrato il mio codice con lo scheduler Spring Quartz da eseguire per ogni minuto, The Batch funziona correttamente con la lettura e la scrittura ma non funziona con l'errore "org.springframework.dao.OptimisticLockingFailureException: tentativo di aggiornare l'ID esecuzione step = 1 con versione errata (2), dove la versione corrente è 1 "

a causa di conflitti Tx. Si prega di suggerire come posso risolvere questo problema.

+0

Hi qualsiasi aggiornamento su questo? – user2583922

+0

Hai risolto? – surlac

+1

Questo potrebbe risolvere il tuo problema http://ashamathavan.blogspot.in/2010/12/optimisticlockingfailureexception.html –

risposta

3

Ho avuto questa stessa eccezione.

org.springframework.dao.OptimisticLockingFailureException: 
Attempt to update step execution id=0 with wrong version (2), where current version is 3 

Nel mio caso, è stato causato da un errore nella fase del processo, che era in deglutizione. Spring Batch attivò lo scrittore, anche se il processore aveva fallito. Guarda i tuoi registri per assicurarti che il tuo passaggio di processo stia completando e restituendo qualcosa.

1

Come indicato da MattC, ho riscontrato questo errore quando il mio ItemProcessor era danneggiato. Per qualche ragione, durante le mie attività del processore, che stava chiudendo la connessione origine dati con jobrepository, quindi il mio eccezione era:

Encountered an error saving batch meta data for step step1 in job myjob. This job is now in an unknown state and should not be restarted. 
org.springframework.dao.OptimisticLockingFailureException: Attempt to update step execution id=1 with wrong version (1), where current version is 2 

Alla fine del stacktrace, sono stato in grado di trovare:

Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Connection is closed. 

Per identificare il problema, per prima cosa isolare la fase. Ho costruito un NoOpProcessor e un NoOpItemWriter. Aggiustato il tasklet e ha funzionato bene. Quindi il mio problema non era nel lettore.

Quindi ho eseguito il rollback sulla mia implementazione "completa" di ItemWriter, e ancora, ha funzionato bene. Quindi il mio problema non era con lo scrittore. Quando ho abilitato il mio processore "pieno", l'errore si è verificato di nuovo. Quindi, c'era l'errore e ho iniziato il debug.

Così, purtroppo, la mia risposta è: eseguire il debug ...

public class NoOpProcessor implements ItemProcessor<Object, Object> { 
    @Override 
    public Object process(Object arg0) throws Exception { 
     System.out.println("Input object: " + Objects.toString(arg0));  
     return arg0; 
    } 
} 

public class NoOpItemWriter implements ItemWriter<Object> { 
    @Override 
    public void write(List<? extends Object> items) throws Exception { 
     if (items != null) { 
      System.out.println("Qtty of items to be written: " + items.size()); 
      for (Object obj : items) { 
       System.out.println(Objects.toString(obj)); 
      } 
     } else { 
      System.out.println("The items list is null. Nothing to be written."); 
     } 
    } 
} 
Problemi correlati