2013-07-16 9 views
5

Ich benutze SpringBatch 2.1.7 Release Core und Infrastructure jars, um eine CSV-Datei zu lesen und in der DB zu speichern.Es wurde versucht, die Schrittausführungs-ID = 1 mit der falschen Version (2) zu aktualisieren. Die aktuelle Version ist 1

Integriert meinen Code mit Spring Quartz Scheduler, um für jede Minute zu laufen, funktioniert der Batch gut mit Lesen und Schreiben, aber seine fehlgeschlagen mit dem Fehler "org.springframework.dao.OptimisticLockingFailureException: Versuch Schritt Schritt ID = 1 mit zu aktualisieren falsche Version (2), wobei die aktuelle Version 1 "

aufgrund von Tx-Konflikten ist. Bitte schlagen Sie vor, wie ich dieses Problem beheben kann.

+0

Hallo jeder Aktualisierung auf das? – user2583922

+0

Haben Sie das gelöst? – surlac

+1

Dies könnte Ihr Problem lösen http://ashamathavan.blogspot.in/2010/12/optimisticlockingfailureexception.html –

Antwort

3

Ich hatte die gleiche Ausnahme.

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

In meinem Fall wurde durch einen Fehler der Prozessschritt verursacht, der verschluckt wurde. Spring Batch hat den Writer aktiviert, obwohl der Prozessor ausgefallen ist. Sehen Sie in Ihren Protokollen nach, um sicherzustellen, dass in Ihrem Prozessschritt etwas abgeschlossen und zurückgegeben wird.

1

Wie von MattC hingewiesen, hatte ich diesen Fehler, wenn mein ItemProcessor wurde abgehört. Aus irgendeinem Grund während meiner Prozessor Aktivitäten, wurde die Datenquelle Verbindung mit jobrepository zu schließen, so meine Ausnahme war:

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 

Am Ende des Stacktrace konnte ich finden:

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

Um das Problem zu identifizieren, isoliere ich zuerst die Phase. Ich habe einen NoOpProcessor und einen NoOpItemWriter konstruiert. Das Tasklet wurde angepasst und es funktionierte gut. Also war mein Problem nicht der Leser.

Dann rollte ich zu meiner "vollständigen" ItemWriter-Implementierung zurück, und es funktionierte wieder gut. Also mein Problem war nicht mit dem Schriftsteller zu tun. Als ich meinen "vollen" Prozessor aktiviert habe, ist der Fehler erneut aufgetreten. Also war der Fehler drin und ich begann mit dem Debuggen.

Also leider ist meine Antwort: 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."); 
     } 
    } 
} 
Verwandte Themen