2020.06 2021.06

Job-Api

Wozu die Job-API?

Es gibt Prozesse die sehr viel Rechenzeit benötigen oder Fehlschlagen können und dann zu einem späteren Zeitpunkt wiederholt werden sollen. Für diese Prozesse gibt es die Job-API. Ein Beispiel ist das Registrieren einer DOI bei einem DOI-Service-Provider. Wenn der Service-Provider gerade nicht erreichbar ist, dann kann die DOI generiert und einem Objekt zugewiesen werden und zu einem späteren Zeitpunkt in einem extra Job registriert werden.

Wie funktioniert die Job-API?

Für die Job-Api werden Aufgaben in Form von MCRJobAction implementiert. Diese Aufgaben erhalten verschiedene Argumente in Form von String-Schlüssel-Wertepaaren, welche in einem MCRJob gespeichert werden.

Ein MCRJob besteht aus JobAction, Parametern, Erstellungsdatum, Start-Datum, End-Datum, id und den aktuellen Status. Diese Jobs werden in den Tabellen MCRJob und MCRJobParameter in der Datenbank gespeichert und gehen so nach einem Neustart der Anwendung nicht verloren.

Die Jobs werden in der MCRJobQueue abgearbeitet. Folgende Properties stehen für die JobQueue zur verfügung:

MCR.QueuedJob.KlassenName.JobThreads=2
Wie viele Jobs dieser Klasse sollen parallel abgearbeitet werden.
MCR.QueuedJob.KlassenName.TimeTillReset=10
Die Zeit in Minuten ab der dieser Job als "Fehlgeschlagen" angesehen wird und anschließend neu gestartet wird.

Wie implementiert man einen eigenen Job?

Zunächst muss eine Aufgabe programmiert werden, welche in einem Job ausgelagert werden soll. Dafür legt man eine Klasse an, welche dann von der MyCoRe-Klasse MCRJobAction erbt. Anschließend muss man folgende Methoden implementieren:

void execute()
Diese Methode wird aufgerufen wenn der Job aus der Datenbank ausgelesen wurde und ausgeführt werden soll. Hier soll der rechenintensive oder wiederholbare Code rein.
boolean isActivated()
Wenn false dann wird der Job (execute()) nicht ausgeführt.
String name()
Gibt einen Namen für den Job zurück, welcher z.B. in der MyCoRe-Prozessliste angezeigt wird
void rollback()
Macht ggf. Änderungen im Fehlerfall rückgängig
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class MeineJobAction extends MCRJobAction {

    public MeineJobAction(){
    }

    @Override
    public boolean isActivated() {
        return true;
    }

    @Override
    public String name() {
        return "Meine Job Action " + this.job.getParameter("Objekt");
    }

    @Override
    public void execute() throws ExecutionException {
        // Aufwendiger Code
        final MCRObject objekt = MCRMetadataManager
        .retrieveMCRObject(MCRObjectID.getInstance(this.job.getParameter("Objekt")));
    }

    @Override
    public void rollback() {
    // Rollback
    }
}
    

Achtung: Die Klasse muss einen Konstruktor haben. Mit this.job.getParameters() kann man auf die Parameter des Jobs zugreifen.

Um einen Job anzulegen muss eine Instanz der Klasse MCRJob erstellen. Als Argument übergibt man die Klasse, welche man im vorherigen Schritt angelegt hat und setzt dann die nötigen Parameter mit den Methoden setParameter​ oder setParameters. Anschließend kann man die Instanz an die MCRJobQueue weitergeben.

1
2
3
4
5
MCRJobQueue queue = MCRJobQueue.getInstance(MeineJobAction.class)
MCRJob meinJob = new MCRJob(MeineJobAction.class)
meinJob.setParameter("Objekt", "mir_mods_00000001");
queue.add(meinJob);