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:

  1. Um 12.30 Uhr der Auftrag gestartet wurde.
  2. Die Arbeit versucht, zu finden die richtige Datei
  3. Der job schlägt mit FileNotFound ( die konfiguriert ist, als ein nicht -überspringbare Ausnahme)
  4. 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 Ihre jobLauncher 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 diese JOB[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 den commit-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 erstellen JobParameters? 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.

InformationsquelleAutor pmanolov | 2011-12-16
Schreibe einen Kommentar