2016-08-03 16 views
1

Ich habe einen Spring-Batchjob, der eine Oracle-Datenbank liest, transformiert und schreibt. Ich führe den Job über das CommandLineJobRunner-Dienstprogramm aus (mit einem fetten jar + Abhängigkeiten, die mit dem maven shade-Plugin generiert wurden); Der Job schlägt aufgrund des "Java-Heap-Speicherlimits erreicht" in der Mitte fehl, und der Job wird nicht als FEHLGESCHLAGEN markiert, sondern zeigt den Status STARTED an.Ein Spring-Batch-Job konnte nicht neu gestartet werden.

Ich habe versucht, den Job mit den gleichen Job-Parametern neu laufen (wie die Dokumentation vorschlagen), aber das gibt mir diese Fehlermeldung:

5:24:34.147 [main] ERROR o.s.b.c.l.s.CommandLineJobRunner - Job Terminated in error: A job execution for this job is already running: JobInstance: id=1, version=0, Job=[maskTableJob] 

org.springframework.batch.core.repository.JobExecutionAlreadyRunningException: A Die Jobausführung für diesen Job wird bereits ausgeführt: JobInstance: id = 1, Version = 0, Job = [maskTableJob] unter org.springframework.batch.core.repository.support.SimpleJobRepository.createJobExecution (SimpleJobRepository.java:120) ~ [ maskeng-batch-1.0-SNAPSHOT-executable.jar: 1.0-SNAPSH

Ich habe alle möglichen Dinge (wie manuell s Setzen Sie den Status mit dem Argument -restart auf FAILED, aber ohne Erfolg. Gibt es etwas, das ich hier vermisse, da ich dachte, dass eine der Stärken des Frühjahrs-Stapels seine Fähigkeit ist, Jobs wieder aufzunehmen, wo sie aufgehört haben .... !!?

+0

Das Ausführen des Jobs funktioniert nicht mit den gleichen Parametern. Fügen Sie die aktuelle Zeit als Parameter hinzu, um sie erneut auszuführen. Siehe http://www.mkyong.com/spring-batch/spring-batch-a-job-instance-already-exists-and-is-complete-for-parameters/. Überprüfen Sie auch die Dokumentation: http://docs.spring.io/spring-batch/reference/html/configureJob.html#d5e1320 –

+0

Ja, ich weiß, aber ich muss einen bestimmten Job erneut ausführen, wie ich es weitermachen möchte wo es aufgehört hat. Mein Job verarbeitet Terabyte von Zeilen und kann bis zu Tage dauern, damit ich das verdammte Ding von Anfang an jedes Mal neu starten kann :-) –

+0

Ich dachte, die Chunk-Verarbeitung in Schritten soll sich um solche Dinge kümmern –

Antwort

2

Als Erstes sollten Sie wissen, dass Joblauncher nicht dazu verwendet werden kann, den Job, der bereits ausgeführt wurde, neu zu starten. Der Grund, warum Sie "JobExecutionAlreadyRunningException" erhalten, liegt daran, dass der Parameter, den Sie übergeben, bereits in der DB vorhanden ist und Sie daher diese Ausnahme erhalten.

Im Frühjahrsstapel kann der Auftrag neu gestartet werden, wenn er mit dem Status "FAILED" oder "STOPPED" abgeschlossen wurde.

JobOperator verfügt über eine Neustartmethode, mit der ein fehlgeschlagener Job neu gestartet werden kann, indem die Jobausführungs-ID übergeben wird, die mit dem Status "FAILED" oder "STOPPED" abgeschlossen wurde.

Bitte beachten Sie, dass ein Job nicht neu gestartet werden kann, wenn er mit dem Status "FINISHED" abgeschlossen wurde. In diesem Fall müssen Sie neuen Job mit neuem Job übergeben Parameter

Wenn Sie manuell den Status des Jobs einstellen mögen als nicht bestand dann die folgende Abfrage ausführen und den Auftrag über JobOperator.restart() Methode neu starten.

Falsche Handhabung der Transaktionsverwaltung könnte ein möglicher Grund dafür sein, dass Ihr Jobstatus nicht mit dem Status "FAILED" aktualisiert wird. Bitte stellen Sie sicher, dass die Transaktion abgeschlossen ist, selbst wenn der Job auf eine Laufzeitausnahme gestoßen ist.

+0

Vielen Dank für diese Antwort.Ich merke, dass wenn ich einen Job habe, der mit status = FAILED und exitstatus = UNKNOWN beendet wurde, kann ich den Job mit denselben Jobparametern erneut ausführen, aber es scheint dort nicht weiterzumachen, sondern einen ganz neuen Joblauf zu starten. Dies war der BefehlLineJobRunner, also werde ich mit jobOperator von einem Java-Haupt suchen und den Exit-Status manuell setzen, wie Sie sagen! –

+0

Sie sind willkommen, wenn Sie denken, dass meine Antwort Ihr Problem gelöst hat, dann akzeptieren Sie es bitte als richtige Antwort, indem Sie auf das Häkchen klicken :). – DevG

+0

Ich habe ein wenig Java hochgejagt, um den Job mit den gleichen Jobparametern über jobOperator neu zu starten, und es scheint, als würde es ok neu starten. Ich sehe sogar "Job wieder aufnehmen" im Protokoll und dachte, alles funktioniert großartig ... aber es sieht so aus, als hätte ich eine neue Ausführungs-ID und der Job-Schritt hat von Anfang an begonnen. Meine Zieldatenbank zeigt, dass sie mehr Zeilen als die Quelle enthält, was beweist, dass sie nicht fortgesetzt wurde. –