Spring batch 2.1.8 Führen Sie eine einzelne Instanz des Auftrags, wenn ein quartz cron trigger feuert
Ich habe eine spring-batch-quartz-set-up. Ich habe zwei jobs konfiguriert und laufen parallel. Die Arbeitsplätze sind in einer Datei zu Lesen, und dann schreiben Sie einige Daten in die db. Hier ist der knifflige Teil, die Dateinamen entsprechen der innerhalb der beforeJob () - Methode meiner Ausführung Zuhörer. Nach jedem Auftrag beendet ist, wird der afterJob() würde dann die Berechnung der nächsten Dateinamen. Die Dateinamen haben Folgendes Muster xxxxxx.nnnn
wo nn.. zahlen, und manchmal kann die Reihenfolge von Nummern fehlen, deshalb bin ich versucht, "springen" über die fehlenden Passagen, und wenn ich eine vorhandene Nummer zu starten den Auftrag.
Ich möchte wissen, ob es möglich ist, zu beschränken, die Zahl der Arbeitsplätze gestartet, jedes mal die cron-trigger ausgelöst wird? Ich will einen einzigen job gestartet, nachdem eine chron trigger feuert.
Beispiel:
- Um 12.30 Uhr der Auftrag gestartet wurde.
- Die Arbeit versucht, zu finden die richtige Datei
- Der job schlägt mit FileNotFound ( die konfiguriert ist, als ein nicht -überspringbare Ausnahme)
- Nach dem job, der mit dem Namen Zähler inkrementiert
Gerade jetzt, wenn der trigger ausgelöst wird, bekomme ich wie 4 oder mehr Arbeitsplätze mit dem gleichen Typ wird asynchron ausgeführt. In meiner batch set-up habe ich zwei <jobs>
konfiguriert zu starten, einen nach dem anderen, jede Stunde innerhalb von 5 Minuten Abstand voneinander. Die Arbeitsplätze, brach der flow im Beispiel. Fazit : Ist es möglich, starten Sie einen einzelnen Auftrag nach einem cron-trigger feuert und haben beide job-Arten parallel laufen.
Peter
- Im einfachen Fall können Sie Ihren
taskExecutor
für IhrejobLauncher
zu akzeptieren nur eine Aufgabe zu einer Zeit. - Gibt es eine Möglichkeit, dass der batch abgebrochen nach einer erfolgreichen job-Instanz Ausführung ?
- Ja, es ist. Man kann sagen, Spring Batch zu beenden, nachdem eine batch verarbeitet wird (konfiguriert durch
commit-interval
) durch die Aktualisierung der job-Ausführungen status:jobExecution.setStatus(BatchStatus.STOPPING); jobRepository.update(jobExecution);
. Spring Batch laden Sie den status in die nächste iteration und ordnungsgemäß beendet. Alternativ können Sie eine Ausnahme werfen. - Das hat nicht funktioniert, In meinem
JobExecutionListener#afterJob
habe ich aktualisiert den Status der batch-und ich bekomme dieseJOB[33505] finished with status STOPPING and exitStatusexitCode=COMPLETED;exitDescription=
. Das ist, was ich wollte, aber ich Schätze, ein neuer job wird gestartet danach. Mit dem Weg über dencommit-interval
der einzige tag, hat diese Eigenschaft den<chunk>
oder bin ich etwas fehlt offensichtlich, das ist nicht so unwahrscheinlich 🙂 - Ich glaube, ich habe deine Frage falsch interpretiert. Für mich Klang es wie "gibt es eine Möglichkeit, dass der batch abgebrochen, nachdem die Aufgabe erfolgreich gestartet wurde". Was Sie wirklich Fragen ist, "gibt es eine Möglichkeit, dass der batch abgebrochen, nachdem die Aufgabe beendet hat," und das ist, was Sie zu tun versuchte, in
afterJob()
. Ich denke, dass Ihre Absicht nicht haben jeden Sinn. Vielleicht, was Sie brauchen, ist zu prüfen, wie Sie erstellenJobParameters
? Eine relevante code. Ich nehme an, was Sie tun: Sie Scannen nach neuen Dateien im job. Das ist nicht ganz korrekt. Sie müssen scan nach neuen Dateien vor dem Start ein lob, und übergeben Sie den Namen der Datei als parameter. - Ja, dass ist das, was ich Tat. Meine ItemReaders müssen die Dateinamen an, so ist es ein Weg, um den Namen der Datei, um Sie (im Grunde haben Zugang zu den jobParameters ) ? Jetzt bin ich mit dem ExecutionListener und ich hasse meinen selbst, es zu tun, aber ich konnte einfach nicht herausfinden, jede andere Art der übergabe der Dateinamen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre Aufgabe sollte wissen, welche Datei verarbeitet werden, bevor es ausgeführt wird. E. g. der name der Datei soll weitergegeben werden als job-parameter. Entfernen
JobExecutionListener
und fügen SieStepExecutionListener
Zugriff auf job-Parameter überStepExecution#getJobParameters()
. Eine Arbeit = eine Datei.Nun von Ihrem Planer Sie wollen, stellen Sie sicher, dass nur ein job wird an einem Punkt der Zeit. Dies können Sie erreichen, in zwei Arten:
• Verwendung des async-task executor. In diesem Fall wird jedes mal, wenn Sie starten Sie den job, es wird nicht ausgeführt, im hintergrund (es sei denn, dein scheduler nicht Feuer timer-Ereignisse, die jedes mal in neuen thread).
• Wenn Sie den gleichen job launcher für andere jobs, die im hintergrund ausgeführt werden, müssen Sie
ThreadPoolTaskExecutor
aber Sie können Sie manuell überprüfen, ob der job ausgeführt wird: