Batches werden verwendet, um mehrere Verzeichnisse, Arbeitsblätter (Sheets) und Transformationen gemeinsam auszuführen, zeitgesteuert oder auf Anforderung.
Ein Batch enthält eine Liste von Batch Elements. Jede Zeile ist ein Startobjekt. Beim Start werden Verzeichnisse, Sheets und verschachtelte Batches zu Transformationen (Actions) aufgelöst. Nur diese Transformationen kommen in die Ausführungswarteschlange.
| Typ | Bedeutung | Was gestartet wird |
|---|---|---|
| Folder | Verzeichnis im Transformationsbaum | Alle Sheets in diesem Ordner, rekursiv, und deren Transformationen |
| Sheet | Arbeitsblatt | Alle Transformationen auf diesem Sheet |
| Action | Einzelne Transformation | Genau diese Transformation |
| Batch | Ein anderer Batch | Die Elemente des referenzierten Batches |
Elemente werden über Add… oder per Drag-and-Drop von Verzeichnissen, Sheets und Transformationen aus dem Baum hinzugefügt. Dieselbe Transformation wird nur einmal gestartet, wenn sie über mehrere Pfade vorkommt.
Die Spalten Prio und Start Mode gelten für das Element und werden an die daraus entstehenden Transformationen vererbt.
Prio (Priorität): Eine kleinere Zahl wird unter wartenden Transformationen zuerst gestartet. Ein leerer Wert gilt als niedrigste Priorität. Die Ausführungsreihenfolge hängt außerdem von den Abhängigkeiten auf dem Sheet und von der Anzahl paralleler Jobs auf dem Server ab. Die Zeilenreihenfolge in der Tabelle ist nicht die einzige Startreihenfolge.
Start Mode:
| Modus | Bedeutung |
|---|---|
| Normal | Die Transformation wartet auf ihre Abhängigkeiten und wird dann ausgeführt |
| Skipped | Die Transformation wird nicht ausgeführt. Sie gilt sofort als beendet, abhängige Transformationen können weiterlaufen |
| Halted | Die Transformation wird sofort auf angehalten gesetzt und nicht ausgeführt |
Ein Batch ohne Elemente kann nicht gestartet werden.
Die Zeitplanung ist frequenzbasiert (kein Cron-Ausdruck). Der Scheduler prüft fällige Batches etwa alle 30 Sekunden. Termine werden in der Zeitzone der Server-JVM berechnet.
| Feld | Bedeutung |
|---|---|
| Active | Wenn gesetzt, nimmt der Batch an der automatischen Zeitplanung teil. Wenn nicht, startet nur ein manuelles Run |
| Time | Uhrzeit des Starts als HH:MM |
| Frequency | Wie oft der Batch geplant wird |
| Day / Minutes | Zusätzlicher Offset; die Beschriftung wechselt mit der Frequenz |
| Frequency | Day / Minutes | Time |
|---|---|---|
| Daily | Wird nicht verwendet | Startzeit an jedem Tag |
| Weekly | Wochentag-Offset 0–6 (0 = Sonntag … 6 = Samstag) | Startzeit an diesem Wochentag |
| Monthly | Tag im Monat: 0 = letzter Tag, 1 = erster Tag … 31 = 31. Tag | Startzeit an diesem Tag |
| Interval in Minutes | Wiederholungsintervall in Minuten | Offset innerhalb dieses Intervalls |
Der nächste automatische Start steht als Next Run (Batch-Toolbar) bzw. Next Start (Batch Overview). On Demand in der Übersicht ist ein Batch ohne Wiederholung; er startet nur mit Run.
Ein manuelles Run (Batch-Kopf, Kontextmenü oder Übersicht) startet den Batch sofort, unabhängig von Active und vom nächsten geplanten Zeitpunkt. Abläufe (Runs) beschreibt, wie ein Ablauf entsteht.
Ein Intervall von 0 Minuten ist ungültig; die automatische Zeitplanung wird dann abgeschaltet.
Wenn ein zeitgesteuerter Batch ausgeführt wird, kann man den Anwender per E-Mail über den Status der Ausführung informieren.
Die Empfänger kommen aus der Mailingliste des Batches für das gewählte Ereignis. Die zusammengefügte Adressliste verwendet dieselbe Syntax mit TO: / CC: / BCC: wie andere datasqill-Mails; siehe E-Mail.
Die folgenden Ereignisse über den Stand des Ablaufs können gesetzt werden:
| Name | Bedeutung |
|---|---|
| On Start | Nachricht wird verschickt, wenn der Ablauf startet |
| On Retry | Nachricht wird verschickt, wenn der Scheduler automatisch nachstartet |
| On Error | Nachricht wird verschickt, wenn der Ablauf in einen Fehler läuft |
| On Skip | Nachricht wird verschickt, wenn eine Aktion übersprungen wird |
| On Hold | Nachricht wird verschickt, wenn der Ablauf angehalten wird |
| On Success | Nachricht wird verschickt, wenn der Ablauf final durchgeführt ist |
| On Action Error | Derzeit nicht implementiert |
Das Format der versendeten Nachrichten wird über ein Freemarker Template angegeben und kann vom Kunden angepasst werden.
Dabei gibt es ein Template für das Betreff und eins für den Nachrichteninhalt. Die Templates sind in der Tabelle vw_sqts_conig_global hinterlegt:
| Typ | config_key1 | config_key2 | config_key3 | config_key4 |
|---|---|---|---|---|
| Betreff | SCHEDULER | TEMPLATE | Mail_Header | |
| Inhalt | SCHEDULER | TEMPLATE | Mail_Content |
Es werden im Freemarker folgende Variablen zur Verfügung gestellt:
| Variable | Datentyp | Bedeutung |
|---|---|---|
| batchName | String | Der Name des Batches |
| eventType | String | Siehe Ereignisse zum Stand des Ablaufes |
| instance | String | Der Name der Umgebung. Wir aus vv_sqts_config_global ermittelt ("SCHEDULER", "TRANSFORMATION", "INSTANCE_NAME") |
| planned | Timestamp | Geplante Zeit des Batches |
| when | String | Effektive Startzeit des Batches |
| resultsFromData | Liste | Liste von Objekten aus dem Batch |
Die Liste der Objekte vom Batch enthält alle Einträge von Actions, die nicht beim ersten Versuch erfolgreich waren. Diese Liste ist nach der Aktion ID aufsteigend und dem Startzeitpunk absteigend sortiert.
Hierbei hat jedes Objekt eine Liste von Namen und deren Werten. Folgende Namen sind verfügbar:
| Name | Datentyp | Bedeutung |
|---|---|---|
| sqtsActionId | Number | Die ID der Action |
| sqtsQueueId | Number | Die ID des dazugehörigen Queue Eintrags |
| sqtsDiagramGroupName | String | Der Name des Sheets |
| actionName | String | Der Name der Action |
| status | Char | Das Kürzel für den Status des Eintrags |
| executionMode | Char | N=Normal, K = Skipped |
| insertUser | String | Der Name des Benutzers, der den Queue Eintrag gemacht hat (initial datasqill) |
| startDt | Timestamp | Startzeitpunkt der Action |
| endDt | Timestamp | Endezeitpunkt der Action |
| errorCode | String | Fehlernummer oder 0 falls kein fehler aufgetreten ist |
| statusText | String | Fehlertext |
Ein Betreff könnte so aussehen:
[#if eventType == 'ON START']
Batch ${batchName}${instance?has_content?then("@" + instance, "")}: started
[#elseif eventType == 'ON ACTION ERROR']
Batch ${batchName}${instance?has_content?then("@" + instance, "")}: ignored
[#elseif eventType == 'ON SKIP']
Batch ${batchName}${instance?has_content?then("@" + instance, "")}: skipped
[#elseif eventType == 'ON SUCCESS']
Batch ${batchName}${instance?has_content?then("@" + instance, "")}: finished
[#elseif eventType == 'ON ERROR']
Batch ${batchName}${instance?has_content?then("@" + instance, "")}: ERROR
[#elseif eventType == 'ON HOLD']
Batch ${batchName}${instance?has_content?then("@" + instance, "")}: Halted
[#elseif eventType == 'ON RETRY']
Batch ${batchName}${instance?has_content?then("@" + instance, "")}: Restarted
Ein einfacher E-Mail Inhalt etwa so:
[#assign statusCodes = { "E": "Error", "F": "Finished", "I": "Interupted", "H": "Halted" }]
[#if eventType == 'ON START']
Batch started, Planned start date: ${planned?string("dd.MM.yyyy HH:mm:ss")}. Effective start date: ${when?string("dd.MM.yyyy HH:mm:ss")}.
[#elseif eventType == 'ON SKIP']
Batch skipped at ${when?string("dd.MM.yyyy HH:mm:ss")}.
[#elseif eventType == 'ON SUCCESS']
Batch successfully completed at ${when?string("dd.MM.yyyy HH:mm:ss")}.
[#elseif eventType == 'ON ERROR']
Batch terminated with ERROR at ${when?string("dd.MM.yyyy HH:mm:ss")}.
[#elseif eventType == 'ON HOLD']
Batch went in halted state at ${when?string("dd.MM.yyyy HH:mm:ss")}.
[#elseif eventType == 'ON RETRY']
Batch was automatically restarted at ${when?string("dd.MM.yyyy HH:mm:ss")}.
[/#if]
[#assign lastId = 0]
[#-- loop over entries--]
[#list resultsFromData as item]
[#-- Prüfen, ob neue Gruppe beginnt --]
[#if item.sqtsActionId != lastId]
[#-- Neue Gruppe: Leerzeile ID und Name ausgeben --]
[#if item?index != 0]
[/#if]
${item.sqtsDiagramGroupName}/${item.actionName}(${item.sqtsActionId?c})
[#assign lastId = item.sqtsActionId]
[/#if]
${item.startDt?string("dd.MM.yyyy HH:mm:ss")} - ${item.endDt?string("dd.MM.yyyy HH:mm:ss")} State: "${statusCodes[item.status]}" [#if item.errorCode = "0"][#if item.executionMode = "K"]Skipped[#else]Solved[/#if] by ${item.insertUser}[#else]Inserted by ${item.insertUser}
Error: ${item.errorCode}[/#if] ${item["statusText"]!" "?replace("\n", " \n")}
[/#list]
Beim Editieren von Batches gibt es unten rechts ein das Fenster Batch Dependencies. Hier wird definiert von welchen Batches (Dependent From) diese Batch abhängig ist, oder in anderen Worten, auf welche Batches dieser Batch reagieren soll, bzw nicht starten oder abbrechen soll.
Es vier verschiedene Gründe, wann ein Batch das Starten dieses Batches beeinflussen kann:
Aktivitäten im Falle einer der Bedingungen
Ein Batch wartet wenn eine Bedingung der abhängigen Batches Wait ergibt Ein Batch wird übersprungen wenn eine Bedingung der abhängigen Batches Skip ergibt Ein Batch wird gestartet, wenn alle Bedingung in allen abhängigen Batches Start ergeben
Abhängigkeit von sich selbst Ein Batch kann auch von sich selbst abhängig gemacht werden. Hierbei werden die Bedingungen If Scheduled und If Missing ignoriert.