|
|
| |
| |
|
Das könnte Sie auch interessieren: HOW TOs!
Die HowTos enthalten lauffähige Konfigurationen, die heruntergeladen und im hot folder der
Job Scheduler Installation verwendet werden können. Die HOW TOs sind Beispiellösungen die für
bestimmte Aufgabenstellungen geschrieben wurden, diese Lösungen sind detaillierter beschrieben als die FAQs.
Lesen Sie mehr über die Beispiellösungen: HOW TOs (engl.)
|
|
|
| |
|
|
| |
| |
| Einen Job erstellen |
| |
Frage:
Wie erstelle ich einen Job um
jede Stunde ein Shell Script zu starten?
Antwort:
In die Konfigurationsdatei ./config/scheduler.xml muss ein Job Element wie folgt eingefügt werden:
<?xml version="1.0" encoding="iso-8859-1"?>
<spooler>
<config>
<jobs>
<job name = "my_shell_script">
<process file = "my_shell_script.sh"
param = ""/>
<run_time repeat = "3600"
begin = "00:00"
end = "24:00"/>
</job>
</jobs>
</config>
</spooler>
Der Job my_shell_script wird jede Stunde gestartet (siehe <run_time repeat=...>)
und führt das Script my_shell_script.sh (siehe <process file=...>) aus.
|
|
|
|
|
| |
| Job-Abhängigkeiten herstellen
|
| |
Frage:
Welche Job-Abhängigkeiten können mit dem Job Scheduler verwaltet werden?
Antwort:
-
Einsatz von Job-Ketten
Die sequentielle Verarbeitung von Jobs kann in Form von Job-Ketten eingerichtet werden,
die sicherstellen, dass ein Folgejob nicht gestartet wird, wenn ein
vorhergehender Job einen Fehler erzeugt. Job-Fehler können per Konfiguration
automatisch erkannt werden anhand des Ausführungsstatus (return code für
ausführbare Dateien), von Signalen (nur für Unix), des Vorhandenseins von
Ausgaben in stderr und von Fehlern, die durch Methoden des API oder
durch SQL-Exceptions (und anderer SQL-Fehler) ausgelöst wurden.
Job-Ketten sind Job-Knoten, die in einer Reihe organisiert sind und in der jedem Knoten ein
bestimmter Zustand zugeordnet ist. Ein Auftrag wird nacheinander von den einzelnen Jobs
einer Job-Kette abgearbeitet. Falls ein Verarbeitungsfehler auftritt, wird der
Auftrag gestoppt und aus der Job-Kette entfernt.
Siehe die Beispiele zur Frage Was ist das Konzept der Job-Ketten und der Auftragsverarbeitung"?
Darüber hinaus können Monitor-Skripte eingesetzt werden, um komplexe Bedingungen
für den Start von Jobs in den Sprachen Java, Javascript, Perl und VBScript zu implementieren.
Das Job Scheduler API bietet die Methode scheduler_job.start() an, die in Skripten verwendet
werden kann, die individuelle Geschätslogik für bedingte Job-Starts implementieren.
Für die Ausführung von Datenbank-Statements können die API-Methoden direkt in
PL/SQL Prozeduren von Oracle verwendet werden. Hierzu werden PL/SQL Wrapper-Funktionen
für die Java-Klassen des API eingesetzt, die es ermöglichen Jobs transaktionssicher
innerhalb von Triggern oder PL/SQL Prozeduren zu starten, d.h. erst nach Abschluß einer
Transaktion mittels commit.
-
Verwendung von Folge-Jobs
Sie können beliebige Jobs konfigurieren, dass die Folge-Jobs abhängig vom aktuellen Job-Ergebnis ausgeführt werden:
<job>
<process file="..."> or <script language="...">
<!-- in case of success the exit code=0, let's start this job -->
<commands on_exit_code="success">
<start_job job="ftp_get_files"><params/></start_job>
</commands>
<!-- in case of error the exit code!=0 -->
<commands on_exit_code="error">...</commands>
<!-- other exit codes could be handled individually -->
<commands on_exit_code="1 2 4 8">...</commands>
</process>
</job>
Sie können jeden Job so konfigurieren, dass er beliebige Folge-Jobs und Aufträge startet.
(ab Job Scheduler Release 1.2.7)
|
|
|
|
|
| |
| Ereignisse für Job-Starts
|
| |
Frage:
Welche Ereignisse können Job-Starts auslösen (z.B. das Vorhandensein einer Datei)?
Antwort:
Jobs können so eingerichtet werden, dass sie nach folgenden Ereignissen starten:
- Ereignisse des Dateisystems: Hinzufügen oder Entfernen einer Datei; die Dateien können mit regulären Ausdrücken gefiltert werden;
- Kalenderereignisse: zu einem Datum, Wochentag, Tag im Monat und Ultimo; Ausnahmen können in Form von Ferientagen konfiguriert werden;
- API Ereignisse: mit der API Methode
spooler_job.start(); diese Methode kann von Jobs in einer der Sprachen Java, Javascript, Perl, VBScript verwendet werden;
- XML-Kommandos können via TCP/IP oder UDP Datagramm an den Job Scheduler gesendet werden. Jobs können
mittels einfacher XML-Kommandos gestartet, gestoppt, angehalten, fortgesetzt und abgebrochen werden, z.B.
<start_job job="cleanup_tmp_files" at="now">.
- Ereignisse, die durch die Web-Oberfläche des Job Schedulers ausgelöst werden: diese Ereignisse verwenden die o.g. XML-Kommandos.
|
|
|
|
|
| |
| Mehrere Jobs gleichzeitig ablaufen lassen
|
| |
Frage:
Können mehrere Jobs gleichzeitig und mit verschiedenen Prioritäten ablaufen?
Antwort:
Mehrere Jobs (<1000) können gleichzeitig ablaufen und einzelne Jobs können in mehreren Instanzen ablaufen, wenn ihre Implementierung das vorsieht.
Ein Beispiel: Sie können Datenbank-Statements in separaten Jobs ausführen lassen und diese Jobs parallel ablaufen lassen; alternativ
können Sie eine begrenzte Anzahl von bspw. 10 parallelen Prozessen eines Standard-Jobs für Datenbankverarbeitung oder ausführbare Dateien ablaufen lassen;
in diesem Fall ordnen Sie den Jobs Aufträge zu, in deren Nutzlast (payload) die SQL-Statements oder Pfade auszuführender Dateien enthalten sind (siehe Job-Ketten).
Für Jobs können Prioritäten konfiguriert werden mittels <job priority="..."/>.
Die Ausprägung der Prioritäten ist betriebssystemabhängig, siehe
Prioritäten.
Prozessprioritäten haben keinen Effekt auf Jobs mit Datenbankbetrieb, da deren Verarbeitungslast
hauptsächlich im Datenbank-Server anfällt.
Darüber hinaus können Jobs Prozessklassen zugewiesen werden, um die Anzahl paralleler Prozesse einer Prozessklasse zu beschränken.
Wenn das Maximum an Prozessen einer Klasse erreicht ist, warten Jobs auf den nächsten freien Prozess und serialisieren sich.
|
|
|
|
|
| |
| Parametrisierbarkeit von Jobs
|
| |
Frage:
Können Parameter Sets für mehrere gleichartige Jobs verwendet werden?
Antwort:
Wenn mehrere Jobs die Implementierung teilen, dann kann jeder Job ein eigenes Parameter Set verwenden, hierzu ein Beispiel,
in dem dieselbe Job-Implementierung für zwei Jobs unterschiedlich parametrisiert verwendet wird:
<job name = "cleanup_sos_files" title = "Remove temporary files">
<params>
<!-- remove temporary files from the given directory otherwise
from the users temp directory -->
<param name = "file_path" value = "/tmp"/>
<!-- remove temporary files with the given prefix -->
<param name = "file_specification" value = "^(sos.*)"/>
</params>
<script language = "java"
java_class = "sos.scheduler.job.JobSchedulerCleanupFiles"/>
<!-- cleanup files in the given interval of seconds (4 hours) -->
<run_time let_run = "yes"
begin = "06:00"
end = "22:00"
repeat = "04:00:00"/>
</job>
<job name = "cleanup_tmp_files" title = "Remove temporary files"/>
<params/>
<param name = "file_path" value = "/tmp"/>
<param name = "file_specification" value = "^(tmp.*)"/>
</params/>
<script language = "java"
java_class = "sos.scheduler.job.JobSchedulerCleanupFiles"/>
<!-- cleanup files in the given interval of seconds (24 hours)-->
<run_time let_run= "yes"
begin = "00:00"
end = "24:00"
repeat = "24:00:00"/>
</job>
|
|
|
|
|
| |
| Job-Ketten
|
| |
Frage:
Wie werden Job-Ketten gehandhabt?
Antwort:
Job-Ketten werden per XML-Konfiguration, mittels Web-Oberfläche oder mittels API-Methoden in eigenen Programmen zusammengestellt:
zunächst erzeugen Sie eine Job-Kette mit den einzelnen Jobs. Jeder Position in einer Job-Kette wird ein Zustand und ein Job zugeordnet.
Dann erzeugen Sie Aufträge, die einem Zustand in einer Job-Kette zugeordnet werden (üblicherweise dem Eingangszustand).
Aufträge können eine Nutzlast (payload) tragen, die Parameter zur Steuerung der Jobs enthält. Wenn ein Auftrag einer Job-Kette
hinzugefügt wird, dann wird er entsprechend seines Zustands in die Auftragswarteschlange eingereiht. Derjenige Job, der für
den Auftragszustand konfiguriert wurde, führt den Auftrag aus.
Jede Position in einer Job-Kette hat einen Folgezustand und einen Fehlerzustand. Der Job Scheduler ändert jeweils den Zustand eines Auftrags
nach der Verarbeitung durch einen Job der Job-Kette. War der Verarbeitungsschritt erfolgreich, dann erhält der Auftrag den Folgezustand,
andernfalls erhält er den Fehlerzustand. Der Auftrag rückt zum nächsten Job in der Job-Kette vor, der für seinen neuen Zustand konfiguriert ist.
Innerhalb einer Job-Kette können Jobs in mehreren Instanzen ausgeführt werden, um Aufträge parallel zu verarbeiten.
|
|
|
|
|
| |
| Benachrichtigung nach Verarbeitung
|
| |
Frage:
Wie funktioniert die Benachrichtigung bei Verarbeitungsende falls Fehler aufgetreten sind?
Antwort:
Die Benachrichtigung erfolgt per eMail. Der Job Scheduler sendet einstellbar (to, cc, bcc) eMails für folgende Ereignisse:
- mail_on_error
- mail_on_warning
- mail_on_success
- mail_on_process (reserviert für Job-Implementierungen mit dem API)
Allen eMail-Benachrichtigungen werden die Protokolle des Jobs bzw. des Auftrags angehängt, in dem der Fehler auftrat.
Die Protokolle enthalten die Ausgaben nach stdout, stderr, SQL-Fehler und Ausgaben nach dbms_output (Oracle)
sowie alle Meldungen (info, warning, error, debug), die mit API-Methoden erzeugt wurden.
|
|
|
|
|
| |
| Verzögerte und wiederholte Verarbeitung
|
| |
Frage:
Welche Möglichkeiten gibt es, um die Job-Verarbeitung zu verzögern oder zu wiederholen?
Antwort:
Folgende Optionen zur Steuerung der Verarbeitung sind verfügbar:
- Eine einfache Möglichkeit einen Job schlafen zu legen und wieder aufzuwecken
besteht darin, ein Wiederholungsintervall in Stunden, Minuten und Sekunden zu konfigurieren.
Der Job wird im Prinzip nicht verzögert, sondern startet nach Ablauf des Wiederholungsintervalls erneut.
- Ein Job kann mit der API-Methode
delay_spooler_process(seconds_or_hhmmss)
veranlasst werden, den nächsten Job-Schritt später auszuführen. In diesem Fall bleibt der Job geladen, d.h.
er ist in Verarbeitung, benötigt aber keine CPU-Zeit bis zum Ablauf des Verzögerungsintervalls.
Diese Möglichkeit existiert nur für Jobs, die die API-Methode spooler_process() implementieren.
- Einem Job kann ein Wiederholungsintervall nach Auftreten eines Fehler zugewiesen werden,
z.B. per Konfiguration oder API-Methoden:
spooler_job.delay_after_error( 2 ) = 10; // 10 Sekunden
spooler_job.delay_after_error( 5 ) = "00:01"; // eine Minute
spooler_job.delay_after_error( 10 ) = "24:00"; // ein Tag
spooler_job.delay_after_error( 20 ) = "STOP";
In diesem Beispiel wiederholt der Job Scheduler den Job sofort nach dem ersten Fehler.
Nach zwei bis vier aufeinanderfolgenden Fehlern erfolgt der Neustart jeweils nach 10 Sekunden;
zwischen fünf bis neun aufeinanderfolgenden Fehlern beträgt das Zeitintervall eine Minute.
zwischen 10 und 19 Fehlern beträgt das Zeitintervall 24 Stunden. Nach 20 aufeinanderfolgenden Fehlern wird der Job gestoppt.
Als Wert des Arguments seconds_or_hhmm_ss kann "STOP" angegeben werden, um die Anzahl fehlerhafter Job-Wiederholungen zu begrenzen.
Der Job wird anschließend gestoppt, d.h. er läuft nach Erreichen der Fehlerzahl nicht mehr automatisch an.
|
|
|
|
|
| |
| Sichtbarkeit der Zeitplanung
|
| |
Frage:
Wie kann ein Benutzer die Zeitplanung und Ausgaben seiner Jobs sehen?
Antwort:
Die Zeitplanung wird in der Web-Oberfläche sichtbar, die jeweils die nächste Startzeit eines Jobs oder Auftrags anzeigt.
Die Ausgaben von Jobs werden in Protokollen gesammelt und sind per Web-Oberfläche oder eMail-Benachrichtigung verfügbar.
Empfänger von eMail-Nachrichten können pro Job konfiguriert werden.
wir unterstützen dagegen nicht das Konzept von "Job-Eigentümern" in der Web-Oberfläche: diese Oberfläche stellt einen
administrativen Zugang dar, nicht ein Endbenutzer-Werkzeug, daher werden hier die Jobs aller Benutzer an den zugelassenen
Rechnern gezeigt. Die Darstellung der Zeitplanung für Endbenutzer kann in einer individuellen Applikation implementiert werden.
Der Job Scheduler bietet hierzu ein XML request/response interface via TCP/IP das zum Auslesen von Job-Informationen
verwendet werden kann.
Beispiel eines request:
<show_state job="scheduler_cleanup_sos_files" what="all"/>
Beispiel einer response:
<job job="scheduler_rotate_log" state="pending" title="Rotate
and compress logfiles"
all_steps="0" all_tasks="0"
log_file="c:/scheduler/logs/job.scheduler_rotate_log.log"
order="no" tasks="1" in_period="yes" next_start_time="2005-10-18 01:00:00">
<tasks count="0"/>
<queued_tasks length="0"/>
<log level="info" highest_level="debug3" last_info=""
mail_on_error="yes"
mail_on_warning="yes" smtp="localhost"
mail_from="scheduler@sos-berlin.com"
mail_to="info@sos-berlin.com"/>
</job>
|
|
|
|
|
| |
| Ad-Hoc Änderungen von Job-Ketten
|
| |
Frage:
Können für vorhandene Job-Ketten ad-hoc Änderungen übernommen werden?
Antwort:
Jobs ohne Bezug zu Job-Ketten können jederzeit hinzugefügt oder entfernt werden; wird ein Job aktuell verarbeitet,
dann wird die Änderung automatisch nach Verarbeitungsende übernommen.
Innerhalb von Job-Ketten können Jobs hinzugefügt und geändert werden ohne den Job Scheduler neu zu starten.
Sie können Aufträge jederzeit ändern, z.B. für eine Job-Kette mit Datenbank-Betrieb kann der Inhalt eines Auftrags,
die entsprechenden SQL-Statements, jederzeit geändert werden.
Die Möglichkeit Änderungen ohne Neustart des Job Schedulers zu übernehmen ist bei Verwendung der Web-Oberfläche
zur Job- und Auftragsverwaltung möglich. Bei Änderungen an der Konfigurationsdatei scheduler.xml
muss der Job Scheduler neu gestartet werden.
|
|
|
|
|
| |
| Triggern von Fehlerzuständen
|
| |
Frage:
Kann ein Job eine Datenbank-Prozedur oder einen anderen Job zur Fehlerbehandlung aufrufen?
Antwort:
Innerhalb von Job-Ketten kann einem Fehlerzustand ein Job zugewiesen werden, den Sie beliebig zur Fehlerbehandlung implementieren können.
Ohne speziellen Fehlerbehandlungs-Job können automatisch eMails mit Protokoll-Anhängen vom Job Scheduler versendet werden.
Für die Verwendung von Folge-Jobs in Fehlerfällen konfigurieren Sie diesen mit:
<job stop_on_error="no">
...
<commands on_exit_code="error">
<start_job job="my_error_handler"><params/></start_job>
</commands>
</job>
Diese Konfiguration lässt den Job im Fehlerfall bei einem exit code ungleich 0
automatisch den Folge-Job starten. Zusätzlich wird in diesem Beispiel das
Stoppen des Jobs im Fehlerfall ausgeschlossen (<job stop_on_error=...>).
|
|
|
|
|
| |
| Drag & Drop zur Job-Konfiguration
|
| |
Frage:
Gibt es eine graphische Oberfläche, mit der eine Datei vom Desktop zur Aufnahme in eine Job-Kette gezogen werden kann?
Antwort:
Nein, die Web-Oberfläche unterstützt kein Drag & Drop.
|
|
|
|
|
| |
| Sichtbarkeit von Jobs
|
| |
Frage:
Wie kann ich einer Gruppe von Benutzern erlauben meine Jobs zu sehen?
Antwort:
Die Web-Oberfläche und die XML-Schnittstelle des Job Schedulers können so konfiguriert werden, dass der
Zugriff auf bestimmte Rechner beschränkt ist:
<security ignore_unknown_hosts = "yes">
<allowed_host host = "192.11.0.0" level = "info"/>
<allowed_host host = "192.11.0.99" level = "none"/>
<allowed_host host = "192.11.0.27" level = "all"/>
</security>
Diese Konfiguration hat folgende Bedeutung:
- alle Rechner im Netzwerk 192.11.0.0 können lesend auf den Job Scheduler zugreifen, d.h. Protokolle und Zeitplanung einsehen
- der Rechner 192.11.0.99 hat keinen Zugriff
- der Rechner 192.11.0.27 hat vollen Zugriff, d.h. kann Jobs und Aufträge starten, entfernen etc.
Sichtbarkeit bedeutet, dass der Job in der Web-Oberfläche angezeigt wird und in den XML-Antworten geliefert wird,
die von einer Applikation auf dem angegebenen Rechner angefordert wurden.
|
|
|
|
|
| |
| Benutzerfreundliche Oberfläche mit drop-down Listen
|
| |
Frage:
Gibt es eine benutzerfreundliche Oberfläche mit drop-down Listen und Eingabehilfen?
Antwort:
wir verwenden drop-down Listen in der Web-Oberfläche zur Job-Konfiguration an allen Stellen, an denen es etwas auszuwählen gibt.
Offen gesagt ist die Web-Oberfläche eher ein administratives Werkzeug für das Job-Management, nicht ein Endbenutzer-Utility,
das die Benutzerfreundlichkeit eines Windows GUI enthält.
Eine Web Demo des Job Schedulers und der Administrations-Oberflächen ist verfügbar
|
|
|
|
|
| |
| Routing der Ausgaben von Jobs
|
| |
Frage:
Welche Utilities sind für das Routing der Ausgaben von Jobs verfügbar?
Antwort:
Die Antwort ist in der Frage Benachrichtigung nach Verarbeitung behandelt. Alle Job-Ausgaben, die
- nach stdout geschrieben werden,
- nach stderr geschrieben werden,
- mit den Logging-Methoden des API (info, warning, error, debug) erzeugt werden,
- durch SQL-Fehler oder Verwendung des Oracle-Pakets dbms_output erzeugt werden,
- die in externe Protokoll-Dateien geschrieben werden, die für ausführbare Programme konfiguriert sind
werden an das Task-Protokoll angehängt und per eMail versendet. Die Empfänger (to, cc, bcc) können zentral oder pro Job konfiguriert werden.
Protokolle mit Job-Ausgaben werden als Text-Dateien im log Verzeichnis und optional in einer Datenbank gespeichert (und optional gepackt).
|
|
|
|
|
| |
| Verzeichnisse überwachen und Jobs automatisch starten
|
| |
Frage:
Kann der Job Scheduler Verzeichnisse überwachen (z.B. FTP Upload-Verzeichnisse) und einzelne oder eine Reihe von Befehlen für jede neue oder veränderte Datei ausführen?
Antwort:
Ja! Das API liefert die Methode start_when_directory_changed (String directory, String pattern) die genutzt wird, um die Dateinamen zu
spezifizieren, die dem Muster entsprechen. Unterverzeichnisse werden in der gleichen Weise überwacht.
Die Überwachung gilt für mehrere Verzeichnisse, wenn diese Methode mehrfach aufgerufen wird.
Darüber hinaus kann jeder Job automatisch per Verzeichnis-Überwachung gestartet werden, z.B.:
<job name = "sample_job">
<process file = "/home/test/scheduler/jobs/sample_script.pl"
param = "-f ${SCHEDULER_TASK_TRIGGER_FILES}"/>
<start_when_directory_changed directory = "/tmp/input" regex = ".*"/>
</job>
In diesem Beispiel werden die Pfade der Dateien, die den Job-Start veranlassen,
über eine Umgebungsvariable an das Job Script übergeben.
Die Pfade mehrerer Dateien werden durch ";" getrennt.
|
|
|
|
|
| |
| Jobs in unterschiedlichen Benutzerkennungen ablaufen lassen
|
| |
Frage:
Kann der Scheduler Jobs in unterschiedlichen Benutzerkennungen ablaufen lassen (nicht alle Jobs in derselben Kennung oder root)?
Antwort:
Ja unter Unix, es gibt hierfür zwei Möglichkeiten:
Beim Einsatz beider Lösungen sollten Sie sicherstellen, dass Benutzerkennung und Kennwort des Job Schedulers nicht
anderen Benutzern zugänglich sind, da unter der Kennung des Schedulers ohne Kennwortabfrage Kommandos in der
Zielkennung ausgeführt werden können.
|
|
|
|
|
| |
| Überwachung und Kontrolle von Jobs
|
| |
Frage:
Kann der Job Scheduler mittels einer Web-Oberfläche gesteuert und überwacht werden?
Antwort:
Ja, der Job Scheduler ist selbst ein Web Server und kann via http://host:port adressiert werden.
Sehen Sie sich Beispiele der Web-Oberfläche an.
Zusätzlich steht eine Web-Oberfläche für das Job Management in PHP zur Verfügung. Mit der Oberfläche können mehrere Job Scheduler
Instanzen überwacht werden, ebenso wie die Job Konfigurationen oder das Management der Job-Ketten etc.
|
|
|
|
|
| |
| Job-Spezifikationen aus Textformaten importieren
|
| |
Frage:
Ist es möglich Job-Spezifikationen aus Textformaten zu importieren, bspw. zur Übergabe an Versionsführungssysteme?
Antwort:
Ja, Job-Spezifikationen basieren auf XML und werden entweder mit einfachen XML-Dateien verarbeitet oder automatisch
aus der Datenbank geladen (Oracle, SQL Server, DB2, MySQL, PostgreSQL, Firebird).
|
|
|
|
|
| |
| Lastverteilung und Ausfallsicherheit
|
| |
Frage:
Unterstützt der Job Scheduler die Lastverteilung und Ausfallsicherheit von Jobs?
Antwort:
Teilweise! Lastverteilung ist nur für auftragsgesteuerte Job-Implementierungen verfügbar. Sehen Sie sich den Abschnitt "Auftragsverarbeitung"
in der Flash-Präsentation an.
Bzgl. der Ausfallsicherheit unterscheiden wir zwischen Job-Fehlern und Scheduler-Fehlern:
- Job-Fehler: Jobs können so konfiguriert werden, dass im Falle eine Fehlers eine automatische
Wiederholung mit einer ebenfalls konfigurierbaren Anzahl von Versuchen gestartet wird.
- Scheduler-Fehler: wird der Job Scheduler mit einer Datenbank betrieben (nicht unbedingt erforderlich),
dann werden automatisch wiederholt Versuche zum Aufbau der Datenbankverbindung gestartet, die Anzahl der Versuche ist konfigurierbar.
Folgende Mechanismen zur Fehlerbehandlung sind verfügbar:
- Überwachungsfehler, z.B. mehrfache Job Scheduler Instanzen laufen auf dem selben Server
und senden Lebendsignale (heartbeats) an einen Master Job Scheduler, der ausschließlich für die Überwachung zuständig ist;
- Neustart einer fehlerhaften Job Scheduler Instanz;
- "sanity checking" zur Überprüfung von Hauptspeicher- und Plattenplatz durch automatisierte Wartungs-Jobs.
Fehlertoleranz im Sinne von automatischer, rechner-übergreifender Ausfallsicherung ist nicht verfügbar. Sollten die Ressourcen (Plattenplatz,
Datenbank etc.) knapp werden, dann schaltet sich der Job Scheduler nach einer konfigurierbaren Wartezeit ab. Derzeit gibt es keine Backup-Instanz des Job Schedulers,
die automatisch Jobs auf einem alternativen Server weiterverarbeitet, falls eine Scheduler-Instanz ausfällt.
|
|
|
|
|
| |
| Job Agenten auf unterschiedlichen Rechnern
|
| |
Frage:
Ist es möglich gleichzeitig Job Agenten auf unterschiedlichen Rechnern ablaufen zu lassen: Solaris, Linux, Windows 2003 Server?
Antwort:
Für die benannten Plattformen ist dieses Feature verfügbar. Job Konfigurationen können entweder direkt aus Dateien oder aus einer
zentralen Datenbank gelesen werden. Die Auslieferung von Jobs in eine heterogene Systemumgebung wird dadurch vereinfacht.
|
|
|
|
|
| |
| Script Jobs mit Standard Unix Script-Sprachen
|
| |
Frage:
Ist es möglich Script Jobs in Standard Unix Script Sprachen (sh, Perl) zu implementieren?
Antwort:
Ja, sh und Perl Scripte können als ausführbare Dateien gestartet werden.
Für Script Jobs kann es noch weitaus interessanter sein das Job Scheduler API nutzen, z.B.
- um Job Scheduler Logs zu schreiben, die in der Web-Schnittstelle sichtbar sind (und die im Falle von Fehlern, Warnungen oder Erfolg automatisch per eMail verschickt werden),
- um den Job-Verarbeitungsstatus zu bestimmen,
- um weitere Jobs mittels API zu starten und um Job-Parameter zu verarbeiten.
API-gestützte Script Jobs werden nicht nur in einem neuen Prozess gestartet, sondern laufen in einem Kindprozess des Job
Schedulers, der die API-Objekte und Methoden direkt dem Script zur Verfügung stellt. Der Job Scheduler wird für die
unterstützten Script-Sprachen mit den entsprechenden Schnittstellenbibliotheken gebunden.
Jobs, die das Scheduler-API nutzen, werden vorzugsweise in folgenden Sprachen geschrieben:
- Java,
- Javascript,
die Mozilla (SpiderMonkey) Laufzeit Umgebung ist
für die o.g. Plattformen integriert.
- unter Windows wird zusätzlich VBScript unterstützt.
- Perl Jobs mit API-Support können zusätzlich unter Windows ablaufen, vorausgesetzt, dass
eine Activestate Implementierung für Perl installiert ist. Für Linux und Solaris gibt es Einschränkungen, da Perl nicht
"threadsafe" implementiert ist, d.h. nebenläufige Prozesse nicht unterstützt werden. Für beide Plattformen müssen die Perl-Bibliotheken mit dem Job Scheduler gebunden werden.
a) Beispiel für Perl Script
Das Paket "Job-Beispiele" der Installation enthält die Dateien "scheduler_samples_perlscript.xml" und "sample_script_notification.pl",
die Konfiguration und Implementierung des Beispiel-Jobs
"sample_script_notification" zeigen. Der Job wird automatisch bei Änderungen im Eingabeverzeichnis gestartet.
b) Beispiel für Perl Script mit Job Scheduler API
Die Datei "sample_api_notification.pl" aus dem Paket "Job-Beispiele" der Installation enthält ein vollständiges
Beispiel für den Gebrauch des Job Scheduler API zur Protokollierung und Fehlerbehandlung.
Das Script verschiebt Dateien von einem Quell- in ein Zielverzeichnis sobald sie im Quellverzeichnis erscheinen
und wird automatisch per Verzeichnisüberwachung gestartet. (Tests des Scripts wurden unter Windows (Active State)
und Linux mit Perl 5.8 durchgeführt.)
Der Unterschied zwischen den Beispielen a) and b) liegt darin, dass a) standalone in der Kommandozeile ausgeführt werden kann,
während b) von Callback-Methoden des Job Schedulers aufgerufen wird.
|
|
|
|
|
| |
| Betrieb mit MySQL 4.0.x
|
| |
Frage:
Funktioniert der Job Scheduler mit MySQL 4.0.x?
Antwort:
Ja, wenn Sie die Datenbank im ANSI Modus betreiben. wir unterstützen eine ganze Reihe von Datenbanksystemen
und sind daher auf ANSI-kompatible SQL-Statements angewiesen.
Für den Betrieb mit MySQL 4.0.x müssen Sie den Datenbankserver im ANSI Modus betreiben,
indem Sie entweder den entsprechenden Eintrag in my.cnf setzen oder den Parameter --ansi
im Startup Skript des Datenbankservers verwenden. Diese Einstellung ist für alle Datenbanken
gültig, die im betreffenden MySQL Server ablaufen.
Ab MySQL 4.1.x ist der ANSI Modus pro Client Sitzung verfügbar und wird automatisch vom Job Scheduler
und der Web-Oberfläche eingestellt, Sie müssen ihn daher ab dieser Version nicht mehr server-seitig einstellen.
|
|
|
|
|
| |
| Datenbankverbindung mit MySQL geht verloren
|
| |
Frage:
ich erhalte den Fehler:
Fehler bei Verbindung mit [host]:[port]: SOS-JAVA-105 Java-Exception java.sql.SQLException("No operations allowed after connection closed."), methode=rollback []
Antwort:
Wenn die Verbindung zur MySQL-Datenbank eine längere Zeit offen ist, ohne dass der Job Scheduler auf sie zugreift,
dann schliesst MySQL die Verbindung ohne dies dem Client (Job Scheduler) mitzuteilen.
Sie können den Wert der MySQL-Systemvariablen wait_timeout erhöhen.
Dieser Wert gibt die Zeit bis zum Schließen einer nicht interaktiven Verbindung in Sekunden an, wenn die Verbindung nicht genutzt wird.
Alternativ kann als Abhilfe ein regelmäßig laufender Job verwendet werden, z.B. der Job scheduler_dequeue_mail,
der den Versand zwischengespeicherter eMails veranlasst, falls zuvor der Mail Server nicht verfügbar war.
Dieser Job-Start veranlasst den Job Scheduler, einen History-Eintrag in die Datenbank zu schreiben, unabhängig davon,
ob Mails zu versenden sind.
|
|
|
|
|
| |
| JDBC Verbindung mit SQL Server
|
| |
Frage:
ich erhalte den Fehler:
SOS-JAVA-105 Java-Exception java.sql.SQLException("[Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]The incoming tabular data stream (TDS) remote procedure call (RPC) protocol stream is incorrect.
Antwort:
Wenn Sie ältere JDBC-Treiber verwenden ( z.B. msbase.jar, mssqlserver.jar, msutil.jar ),
dann wird die Verbindungszeichenfolge in der Datei ./config/factory.ini anders formuliert als bei neuerem sqljdbc.jar.
ALT:
db = jdbc -class=com.microsoft.jdbc.sqlserver.SQLServerDriver jdbc:microsoft:sqlserver://localhost:1433;selectMethod=Cursor;databaseName=scheduler -user=scheduler -password=scheduler
NEU:
db = jdbc -class=com.microsoft.sqlserver.jdbc.SQLServerDriver jdbc:sqlserver://localhost:1433;sendStringParametersAsUnicode=false;selectMethod=cursor;databaseName=scheduler -user=scheduler -password=scheduler
Bitte beachten Sie die unterschiedlichen Klassennamen und die Groß-/Kleinschreibung beim Wert cursor.
|
|
|
|
|
| |
| eMail-Versand durch den Job Scheduler funktioniert nicht
|
| |
Frage:
Es werden keine eMails mit Protokollen vom Job Scheduler versendet, weshalb?
Antwort:
Die Absenderadresse muss eine gültige Adresse für den Mail Server sein.
Es kann andernfalls Probleme mit Hostnamen der eMail-Adresse für ausgehende Mails geben.
Passen Sie die Absenderadresse im Eintrag log_mail_from in der Datei ./config/factory.ini an.
|
|
|
|
|
| |
| Neustart des Job Schedulers
|
| |
Frage:
Wann ist ein Neustart des Job Schedulers erforderlich?
Antwort:
Nach Änderungen einer Konfigurationsdatei aus dem ./config Verzeichnis.
Nach dem Austausch von Bibliotheken im ./lib Verzeichnis.
Im Routine-Betrieb ist ein Neustart des Job Schedulers - auch über einen längeren Zeitraum hinweg - nicht erforderlich.
|
|
|
|
|
| |
| Lizenzschlüssel für den Job Scheduler
|
| |
Frage:
Der Job Scheduler fragt nach einem Lizenzschlüssel, ist die Software nicht Open Source?
Antwort:
Wenn Sie den Job Scheduler unter Unix mit der Datei ./bin/scheduler bzw. unter Windows mit
der Datei ./bin/scheduler.exe starten,
erhalten Sie folgende Fehlermeldung:
SOS-1000 No licence key was found or licence key has expired. Please contact your systems administrator or Software- und Organisations-Service GmbH, Fax +49 (30) 861 33 35, Mail info@sos-berlin.com [Scheduler].
Benutzen Sie zum Starten des Job Schedulers das Startskript ./bin/jobscheduler.sh (Unix) bzw. ./bin/jobscheduler.cmd. (Windows).
Die Binärdatei wird vom Startskript parametrisiert aufgerufen.
Einer der Parameter (-sos.ini=...) im Startskript adressiert die Lizenzdatei ./config/sos.ini,
die einen freien Lizenzschlüssel für die GPL Version des Job Scheduler enthält.
Es gibt keinen funktionalen Unterschied zwischen GPL und kommerzieller eingesetzter Version, der Lizenzschlüssel hilft
uns lediglich Kunden mit kommerziellem Support bei Rückfragen zu identifizieren.
|
|
|
|
|
| |
| Sichere Datenübertragung mit dem Job Scheduler
|
| |
Frage:
Wir müssen einen ftp get file-Ablauf auslösen, wenn eine Datei auf einem dezentralen Server zur
Verfügung steht. Was geschieht wenn:
- das dezentrale Server-Betriebssystem nicht vom Job Scheduler unterstützt wird?
- wenn wir uns nicht auf ein Programm verlassen wollen, dass das Job Scheduler API über eine dezentrale
Verbindung nutzt um Ereignisse mitzuteilen (wir sind nicht in der Lage zusätzliche Programme
auf dem dezentralen Server einzusetzen und zu betreiben).
Ist es möglich, dezentrale Datenverzeichnisse oder Ordner mit dem Job Scheduler zu überwachen, so
dass eine Mitteilung vom Job Scheduler empfangen wird, der dann wiederum das ftp get file-Programm
(oder Script) startet?
Antwort:
- Vorgeschlagene Lösung: Signalling
Wenn der dezentrale Host dafür verantwortlich sein soll, ein Signal zu senden, um das Eintreffen einer
Datei mitzuteilen, dann:
- sollten Sie keine Bedenken haben, das Job Scheduler API zu nutzen, da
dies so einfach sein kann, wie im folgenden Beispiel:
telnet [scheduler_host] [scheduler_port]
<start_job job="ftp_get_files"></params></start_job>
Dieser einfache Befehl ist aller Wahrscheinlichkeit nach für den dezentralen Host verfügbar.
Mit einem TCP Stack können Sie einen XML-Befehl an den Job Scheduler senden, der ankündigt, was als nächstes
getan werden soll, beispielsweise einen Job starten. Große Teile des API sind als XML-Befehle verfügbar,
die mittels TCP oder UDP an den Job Scheduler gesendet werden können. telnet ist nicht die
einzige TCP-Lösung, die Sie einsetzen können, es ist ein Beispiel für die Befehlszeile.
- können Sie das Job Scheduler API auch ohne Installation nutzen
wir liefern Java-Klassen aus, die ohne die Installation des Job Schedulers genutzt werden können,
beispielsweise mit einer Befehlszeile wie folgt:
java -cp ./sos.scheduler.jar:./sos.util.jar sos.scheduler.SOSSchedulerCommand
[scheduler_host] [scheduler_port] [xml command]
Java ist für die meisten Betriebssysteme verfügbar, d.h. der dezentrale Host kann diese Befehlszeile
nutzen, um einen XML-Befehl an den Job Scheduler zu senden, auch dann wenn kein Job Scheduler auf dem
dezentralen Host installiert ist. Ein Standard JRE 1.4.2++ und das obige .jar Archiv reichen für
den dezentralen Host aus.
- können Sie einen alternativen TCP/UDP Stack nutzen
Jede Programm- oder Scripting-Sparche, die TCP oder UDP unterstützt, kann genutzt werden, um
XML-Befehle zu senden.
Die oben benannten Szenarien bedeuten jedoch nicht, dass Sie die jeweiligen Programme/Scripte auf dem
dezentralen Host pflegen müssen, da dies mit den Standardfunktionen des Betriebssystems erledigt werden kann.
Wie Sie sehen, empfehlen wir für den Einsatz UDP, da dies ein non-blocking Protokoll ist. Das bedeutet,
dass der dezentrale Host unberührt bleibt von Fehlern, die beispielsweise durch Netzwerkprobleme ausgelöst werden.
Das signalling sollte als zusätzliche Option in der Kommunikation zwischen dezentralem Host und
Job Scheduler eingesetzt werden, weil es die Abwicklungsgeschwindigkeit erhöht, es kann jedoch das
polling nicht ersetzen.
- Vorgeschlagene Lösung: Polling
Wir empfehlen diese Lösung, da sie sicher und einfach zu implentieren ist, wenn man überprüfen möchte, ob eine
Datei auf einem dezentralen Host existiert:
- Mit FTP prüfen
Mehr Information über das Thema 'Standard-Jobs' finden Sie im Kapitel 'FTP-Verarbeitung'
Job Scheduler Standard-Jobs und in der Job-Dokumentation in
Job Scheduler FTP Receive.
Der bestehende Code kann angepasst werden, damit bestimmte exit codes signalisieren, ob
Daten im dezentralen Verzeichniss verfügbar sind oder nicht.
- Mit ssh prüfen
Für diese Lösung benötigt man auf dem dezentralen Host einen Shell Script oder Befehl für das Betriebssystem.
Ein Job wird mittels ssh gestartet und prüft, ob Datein verfügbar sind. Der Script/Befehl
kann implementiert werden, um mit einem bestimmten exit code zu signalisieren, dass Daten für die
Übertragung bereitstehen.
So könnte eine Pseudo-Konfiguration für die Datei scheduler.xml aussehen:
<job>
<process file="ssh" param="-l [user]@[host] [script_or_command]">
<!-- restart this job if an error occurs, e.g. file not present,
server unavailable etc. -->
<delay_after_error error_count="1" delay="60"/>
<!-- repeat this job every 60s after the first error occurred -->
<delay_after_error error_count="10" delay="600"/>
<!-- repeat this job every 600s after the 10th error occurred -->
<delay_after_error error_count="50" delay="stop"/>
<!-- stop this job after 50 subsequent errors -->
<!-- in case of files found: exit code=0, let's fetch the files -->
<commands on_exit_code="success">
<start_job job="ftp_get_files"><params/></start_job></commands>
<!-- in case of absence of files: exit code=1 -->
<!-- let's ignore this return code -->
<commands on_exit_code="1"/>
<!-- other exit codes are automatically handled as errors,
otherwise you could start individual jobs to handle errors -->
<!-- <commands on_exit_code="error">...</commands> -->
</process>
</job>
Die Fähigkeit, Folge-Jobs zu starten, die auf exit codes basieren, ist nicht auf ssh oder
<process file=""/> beschränkt, sondern Sie können jeden
Job so konfigurieren, dass beliebige Folge-Jobs und Aufträge vom Job Scheduler
(ab 1.2.7) ausgelöst werden.
- Konkurrierende Zugriffe
Ein einfacher Weg um konkurrierende Zugriffe zu verhindern ist, den Client zu veranlassen,
Dateinamen wie filename~ nach der Übertragung in filename umzubenennen,
da dann die überwachten Dateinamen automatisch erscheinen.
Etwas anspruchsvollere Lösungen werden benötigt für die folgenden Situationen:
-
Was soll passieren, wenn eine Eingabedatei
über einen längeren Zeitraum nicht übertragen werden kann, gleichtzeitig aber
bereits neue Daten auf dem dezentralen Host bereitstehen?
-
Wie sollen mehrere Eingabedateien gehandhabt werden, die in einer
einzelnen Übertragung vom Client verarbeitet werden sollen, z.B. beim Import in ein DBMS?
Wir haben kommerzielle Lösungen für diese Situationen implementiert, die auf Ampel-Regeln
beruhen. Sollten Sie an dieser Lösung interessiert sein, schreiben Sie ein
eMail.
|
|
|
|
|
| |
| Wie implementiert man Jobs with Perl?
|
| |
Frage:
Woher erhalte ich die Perl-Bibliotheken für das Job Scheduler API?
Die Beispiele enthalten ein Paket main, erhalte ich das mit dem Job Scheduler Download, oder muss
ich das von CPAN laden?
Antwort:
Das hängt vom Betriebssystem ab:
-
für Windows liefern wir keine Bibliothek aus, statt dessen nutzen wir Script-Bibliotheken aus der existierenden
ActiveState Perl Impelementierung. Schauen Sie hier nach: http://www.activestate.com.
-
für Unix muss die Bibliothek
libsosperlscript.so vom Installierer in das
lib-Verzeichnis kopiert werden. Weiter befindet sich im Verzeichniss die
libperl.so-Bibliothek, die durch Ihre Perl-Installation ersetzt werden kann. Dieses Unter-Programm
muss zu den thread-Optionen passen, mit denen Perl kompiliert wurde. Im Setup wird die
Perl-Version 5.8.0 zur Verfügung gestellt, die für multithreading ausgelegt ist.
Beachten Sie dabei:
-
Sie können folgende Konfiguration benutzen
<job><process file="my_script.pl"/></job>
um Perl genau wie von der Kommandozeile zu verwenden (my_script.pl eine ausführbare Datei sein).
Das funktioniert mit allen Versionen von Perl, API-Methoden des Job Schedulers können jedoch
nicht genutzt werden.
-
Sie können diese Konfiguration benutzen
<job><script language="perlscript"><include file="my_api_script.pl"/></job>
für ein Perl Script, das das Job Scheduler API nutzt und die obigen Bibliotheken für Unix benötigt.
Folgende API-Dokumentation ist verfügbar:
Eine spezielles Job Scheduler Paket für Perl gibt es nicht, da der Job Scheduler die Objekte und Methoden direkt
dem Script zur Verfügung stellt, nutzen sie einfach:
# ...um Objektvariablen zur Verfügung zu stellen
use vars qw ($spooler $spooler_log $spooler_job $spooler_task);
# ... benutzen Sie die Objekte und Methoden, z.B. um auf Job-Parameter zuzugreifen
$spooler_task->params->value("request_stylesheet")
Weitere komplette Beispile von Perl-Jobs finden Sie auf dieser Web-Seite unter
Lösungen, speziell unter
Web Services für ausführende Dateien
Die vorgestellten Beispiele sind auch interessant, wenn Sie keine Web Services einrichten möchten,
denn der Source Code und die Job-Dokumentation für die Job-Implementierungen mit Perl, Java und Javascript
verdeutlichen wie das API in den verschiedenen Sprachen verwendet wird.
|
|
|
|
|
| |
| Was ist das Konzept der Job-Ketten und der Auftragsverarbeitung?
|
| |
Frage:
Ich habe zwei Jobs als job_chain_nodes in einer Job-Kette eingerichtet,
die auf scheduler_sample_perlscript.xml basieren.
Danach habe ich den ersten Job gestartet, der ein FTP get ausführt und mir die Dateien holt.
Mein Problem ist, dass der zweite Job nicht startet nachdem der erste Job beendet ist.
Was könnte hier das Problem sein?
Antwort:
Es handelt sich um ein Missverständnis, wenn Sie sagen: "ich habe den ersten Job ausgeführt ...".
Wenn Sie Jobs in einer Job-Kette organisieren, dann starten Sie die Jobs nicht manuell, vielmehr
erstellen sie einen Auftrag, der die Jobs automatisch startet. Job-Ketten werden von Aufträgen
angestoßen, z.B. würden Sie mehrere Aufträge gleichzeitig erstellen, mit einer vorgegebenen
Laufzeit oder Wiederholungsintervall.
Sehen Sie sich zu Verdeutlichung den "Single Take Order Processing" in unserer
Flash Präsentation an.
Beispiel für eine Job-Kette und einen Auftrag
<spooler>
<config>
<jobs>
...
</jobs>
<job_chains>
<job_chain name="TestGetandPut">
<job_chain_node state="1"
job="TestGet"
next_state="100"
error_state="999"/>
<job_chain_node state="100"
job="GetPut"
next_state="200"
error_state="999"/>
<job_chain_node state="200" />
<job_chain_node state="999" />
</job_chain>
...
</job_chains>
<commands>
<!-- here you add an order for your job chain>
<add_order job_chain=" TestGetandPut"
title="sample order" replace="yes">
<params/>
<!-- sample run time: repeat the execution of this order
every day at the given hour -->
<!-- without run time specification an order is fired just
once and will not be repeated -->
<run_time><period single_start="23:36"/></run_time>
</add_order>
</commands>
</config>
</spooler>
Wird ein Auftrag in eine Job-Kette eingestellt, dann wird dieser von dem Job ausgeführt, der mit
dem Eingangsstatus "1" gekennzeichnet ist, beispielsweise mit TestGet.
War die Verarbeitung erfolgreich, dann erhält der Auftrag den Status des nächsten Job-Knotens in
der Job-Kette ("100").
Der Auftrag wird jetzt von dem Job TestPut in der zweiten Position der Job-Kette
ausgeführt, was im Endstatus "200" resultiert, d.h. der Auftrag verlässt die Job-Kette. Wäre ein
Fehler aufgetreten, beispielsweise im Job TestGet, dann hätte der Auftrag den
Fehlerstatus "999" erhalten. Im Konfigurationsbeispiel ist das der Endstatus, d.h. der Auftrag
verlässt die Job-Kette.
Zusätzlich zu diesem Konfigurationsbeispiel können Sie das Job Scheduler API nutzen, um den
Status eines Auftrags mit Ihrer Geschäftslogik abzustimmen. Soll die Verarbeitung einer Job-Kette
nicht linear sein soll, sondern der Folge-Job vom Resultat der Ausführung oder einem anderen
Ereigniss in Ihrem Job abhängen, dann können Sie die Methode order.set_state("300")
nutzen, um den Status für den nächsten Folge-Job zu setzen.
Dieses Konzept mag erstaunlich klingen, aber denken Sie an die Vorteile. Einige sind hier aufgelistet:
-
Aufträge können simultan verarbeitet werden und die Jobs können
(z.B. nach
<job tasks="3"/>)
in parallelen Tasks Aufträge verarbeiten.
-
Aufträge können Parameter haben, d.h. Sie verwenden die selbe Job-Implementierung, die
für den Ausführungszeitpunkt eines jeweiligen Auftrags parametrisiert wird, z.B. indem
die Auftragsparameter Einstellungen beinhalten, die für die FTP-Verbindung benötigt werden.
-
Aufträge können eine Nutzlast (payload) haben, d.h. beliebige xml Strukturen, die für jeden Job in einer Job-Kette
zur Verfügung stehen, können auf diese Weise genutzt werden, um Ausfühungsergebnisse von einen Job zum nächsten
in der Job-Kette weiterzugeben.
-
Aufträge können zurückgesetzt werden, d.h. sie können in ihrer Position in der Job-Kette zurückgesetzt werden,
um an einer bestimmten Stelle wieder gestartet zu werden.
-
Jeder Auftrag hat seine eigene Protokolldatei, die alle Informationen aller Jobs beinhaltet, die in der Job-Kette
für den Auftrag durchlaufen wurden.
Um einen ähnlichen Effekt zu erzielen, können Sie Folge-Jobs verwenden:
zwei Jobs werden
in Folge ausgeführt, erzeugen aber unterschiedlichen Protokolldateien.
|
|
|
|
|
| |
| Wo finde ich ein einfaches Beispiel für eine Job-Kette?
|
| |
Frage:
Braucht jede Job-Kette einen Auftrag, der sie startet?
Gibt es ein einfaches Beispiel zur Verwendung von Job-Ketten und Aufträgen?
Antwort:
Die Ausführung von Jobs in einer Kette wird immer durch einen Auftrag veranlasst. Daher
werden drei Bestandteile benötigt: Jobs, eine Job-Kette und ein Auftrag.
- Zunächst ein Blick auf die Job-Implementierung.
Beliebige Jobs können in Ketten verwendet werden, sie müssen das
Attribut
order="yes" aufweisen:
<spooler>
<config>
<jobs>
<job name="command_1" title="sample_command" order="yes">
<script language="shell">
<![CDATA[
C:\Programme\Samples\Scripts\command_sample_1.cmd
]]>
<script>
</job>
<job name="command_2" title="sample_command" order="yes">
<script language="shell">
<![CDATA[
C:\Programme\Samples\Scripts\command_sample_2.cmd
]]>
<script>
</job>
</jobs>
</config>
</spooler>
-
Als nächstes wird eine Job-Kette benötigt, die den Jobs jeweils einen Status und Job-Knoten zuweist:
<spooler>
<config>
<job_chains>
<job_chain name="command_sequence">
<job_chain_node state="first"
job="command_1"
next_state="second"
error_state="error"/>
<job_chain_node state="second"
job="command_2"
next_state="success"
error_state="error"/>
<job_chain_node state="success"/>
<job_chain_node state="errror"/>
</job_chain>
</job_chains>
</config>
</spooler>
Das Beispiel weist dem obigen Job command_1 den ersten Knoten in der Job-Kette
und dem Job command_2 den zweiten Knoten zu, der ausgeführt wird, wenn der
erste Job-Knoten erfolgreich abgeschlossen wurde. Die Verkettung erfolgt mit den Attributen
next_state, das den Status des nächsten auszuführenden Job-Knotens in der Kette bestimmt,
und error_state, das den Job-Knoten bestimmt, der im Fehlerfall ausgeführt wird.
Job-Knoten für Endzustände können ohne Implementierung bleiben wie im Fall von success
und error, darüber hinaus können individuelle Job-Implementierungen für die Fehlerbehandlung
erfolgen.
-
Schließlich wird ein Auftrag benötigt, der die Ausführung der Job-Kette veranlasst:
<spooler>
<config>
<commands>
<add_order job_chain="command_sequence"
title="sample command sequence" replace="yes">
<params/>
<!-- sample run time: repeat the execution of this order
every day at the given hour -->
<run_time><period single_start="23:36"/></run_time>
</add_order>
</commands>
</config>
</spooler>
Der Auftrag wird für folgende Zwecke eingesetzt:
- Die Ausführung der Job-Kette veranlassen:
Eine Job-Kette wird nicht durch das Starten des ersten Job-Knotens ausgeführt, sondern durch das Starten eines Auftrags.
Die eingebaute HTML-Oberfläche des Job Schedulers bietet die entsprechenden Operationen für Aufträge an.
Mehrere Aufträge können die parallele Ausführung von Jobs in einer Job-Kette veranlassen.
Der Job Scheduler wird dann dynamisch Tasks zur parallelen Ausführung bereitstellen.
- Den Jobs einer Job-Kette Parameter hinzufügen:
Parameter aus Aufträgen werden mit Priorität den Parametern einer Job-Konfiguration hinzugefügt
(<job><params><param name="sample_name" value="sample_value"></params></job>).
- Startzeit für automatische Ausführung angeben:
Beliebige Perioden für die wiederholte Ausführung können angegeben werden.
Sie könnten jetzt fragen, weshalb ein Auftrag benötigt wird, wenn Parameter und Startzeitpunkte genauso
für einzelne Jobs konfiguriert werden können? Die Antwortet lauet: Zur Wiederverwendbarkeit von Jobs und Job-Ketten.
Mehrere Aufträge können für dieselbe Job-Kette mit unterschiedlichen Parametern verwendet werden.
|
|
|
|
|
| |
| Wiederherstellen von eingereihten Aufträgen und Jobs in Job-Ketten
|
| |
Frage:
Wir haben eine Job-Kette mit Jobs 1, 2 und 3 erstellt, ich beende den Scheduler nachdem Job 1 gelaufen ist, aber
während Job 2 noch läuft, starte ich den Scheduler wieder. Beginnt der Scheduler bei einem Neustart den
Job-Ablauf bei Job 2?
Antwort:
Ja, der Auftrag wird mit dem Status für Job 2 eingereiht. Dies trifft für Aufträge sowie Jobs zu:
1) Persistenz eingereihter Aufträge
Wenn ein Auftrag eingereiht ist (entweder für eine einmalige Verarbeitung ohne Laufzeit oder
mit einer Laufzeit für wiederholte Verarbeitung) speichert der Scheduler den Auftrag in der
Datenbank (und zwar in der Tabelle SCHEDULER_ORDERS), natürlich nur dann, wenn eine Datenbank
eingesetzt wird. Dieses Verhalten ist unabhängig von der Nutzung der "Managed Jobs", sondern betrifft alle Aufträge.
Veränderungen im Auftragsstatus reflektieren den Stand der Verarbeitung des Auftrags in der Job-Kette
und werden in der Datenbank aktualisiert. Damit der Auftrag transaktionssicher ist, wird er aktualisiert nachdem:
- die Methode
spooler_process() ist für Jobs beabsichtigt, die das API mittels
<script/> nutzen.
- eine ausführbare Datei beendet wurde, die mit dem
<process/> gestartet wurde.
Wird der Job Scheduler beendet während ein Auftrag bearbeitet wird, dann wird der Auftrag in seinem
aktuellen Zustand beim nächsten Starten des Job Schedulers aus der Datenbank wiederhergestellt.
2) Persistenz eingereihter Jobs:
Die Handhabung ist wie folgt:
-
Werden Tasks während der Bearbeitung gestoppt, weil der Master Job Scheduler gestoppt wird,
dann werden diese nach einem Neustart des Job Schedulers nicht automatisch neu gestartet
(der Grund hierfür ist, dass der Job Scheduler nicht entscheiden kann, ob es sinnvoll ist
den Job noch einmal auszuführen in Hinsicht auf Laufzeiten und korresponierende Anfangs- und Endzeiten).
-
Wird eine Task für ein zukünftiges Datum eingereiht, z.B. mit
<start_job job="..." at="now+3600"/><params/></start_job>
oder mit den entsprechenden API-Methoden, dann ist die Startzeit dieser Task in der Datenbank erfasst
(in der Tabelle SCHEDULER_TASKS).
Für Aufträge und Jobs liest der Job Scheduler die entsprechenden Tabellen beim Start und reiht diese
dann für den vorgegebenen Zeitpunkt wieder ein.
|
|
|
|
|
| |
| Wie werden Ferieneinstellungen im Job Scheduler konfiguriert?
|
| |
Frage:
Wie werden Jobs eingerichtet, die jeden Tag laufen? Wir brauchen u.a. einen Mechanismus,
um einen Ferienkalender einzubauen, der für das ganze Jahr gültig ist und der durch einen
Neustart am Wochenende nicht verloren geht. Wir müssen den Job Scheduler so konfigurieren, dass
er beispielsweise an 10 bestimmten Tagen im Jahr nicht läuft. Wie geht man da am besten vor?
Antwort:
Ferien können wahlweise in den globalen Einstellungen für alle Jobs, oder für individuelle Jobs konfiguriert werden.
Beide Ferieneinstellungen werden ausgeführt und gehen auch bei einem Neustart nicht verloren. Sie sind
Teil der Konfigurationsdatei scheduler.xml, oder sie werden über die Web-Oberfläche für die
entsprechenden Laufzeiten eingerichtet und sind somit in der Datenbank gespeichert.
Die Ferientage können über den Job Konfigurations-Editor verwaltet werden.
1) Ferien für alle Jobs
<config>
<holidays>
<holiday date="2006-12-25"/>
...
<holiday date="2006-12-26"/>
</holidays>
<jobs/>
<job_chains/>
</config>
2) Ferien für einen speziellen Job
<job>
<run_time let_run="no">
<period single_start = "08:00"/>
<holidays>
<holiday date="2006-06-19"/>
...
<holiday date="2006-07-19"/>
</holidays>
</run_time>
</job>
|
|
|
|
|
| |
|
Die Master- und Slave-Beziehungen im Job Scheduler
|
| |
Frage:
Können Sie die Master- und Slave-Beziehungen etwas detaillierter erläutern?
Wenn ich einen Master und 5 Slaves habe, kann ich dann updates und Überwachung (monitoring) für alle Slaves
mit dem Master Job Scheduler erledigen?
Antwort:
Es gibt zwei Vorgehensweisen: eine lose Koppelung von Master und Slave Job Scheduler, die vom Master
überwacht wird, oder man kann mittels der in der Datenbank gespeicherten globalen Konfiguration
mehrere Job Scheduler in gleicher Weise einrichten. Beide Vorgehensweisen können kombiniert werden.
1) Lose gekoppelte Job Scheduler
Die Slave Job Scheduler implementieren eine heartbeat-Lösung, d.i. ein TCP-Signal
einmal pro Minute an den Master Job Scheduler. Das kann in der Datei scheduler.xml konfiguriert werden:
<config main_scheduler = "remotehost:4444">
...
</config>
Von jedem Slave Job Scheduler wird das Signal an den entsprechenden host:port gesendet.
Der Master Job Scheduler registriert das Signal und verwaltet eine Liste von Slave Job Schedulern.
Wird das Signal nicht wiederholt, dann wird der Slave Job Scheduler als "disconnected" betrachtet und kann
jederzeit nach Eingang eines Signals wieder den Zustand "connected" erhalten.
Die Informationen über die registrierten Slaves des
Master Job Schedulers sind in der Web-Oberfläche, dem API oder via XML-Befehlen verfügbar.
(<show_state what="remote_schedulers"/>)
Zusätzlich stellen wir mit der Auslieferung (Download) einen Standard-Job zur Verfügung, der im
Master Job Scheduler ausgeführt wird und prüft, ob Slaves aktiviert sind. Sie sollten diesen
Standard-Job nutzen, wenn Sie mehrere Job Scheduler betreiben und per eMail Hinweise über Warnungen darüber
erhalten wollen, ob die Slaves registriert sind oder nicht, verbunden oder nicht verbunden sind oder ob ein Slave
Job Scheduler beendet wurde.
Weitere Informationen erhalten Sie in der Job-Dokumentation:
Job Scheduler Check Slaves
Eine vollständige Liste der Standard-Jobs und des Source Codes erhalten Sie hier:
Solutions / Standard-Jobs
2) Nutzung des Installationspakets Managed Jobs
Im Falle der Managed Jobs sind neben der Konfiguration in scheduler.xml die Konfigurationen
für Jobs, Job-Ketten und Aufträge in der Datenbank gespeichert.
Diese Konfigurationen können einem oder mehrerem Job Schedulern zugeordnet werden, vorausgesetzt die Slaves
werden durch IDs unterschieden, die in scheduler.xml mit <config spooler_id = "id1"/> benannt sind.
Wenn Sie an mehrere Job Scheduler die gleiche ID vergeben, dann werden alle mit den Konfigurationen laufen, die
Sie dieser ID in der Web-Oberfläche der Managed Jobs zugewiesen haben.
Damit mehrere Job Scheduler die zentrale Konfiguration in den Managed Jobs lesen, ist im Installations-Paket
eine zusätzliche Konfigurationsdatei scheduler_managed.xml enthalten, die ein Start-Script beinhaltet, das die
Konfiguration aus der Datenbank liest, z.B.
<config>
<script language = "java"
java_class = "sos.scheduler.managed.JobSchedulerManagedStarter"/>
<jobs/>
<job_chains/>
</config>
Weitere Details finden Sie in der Hilfe für
Job Scheduler Managed Jobs
|
|
|
|
|
| |
|
Wie können Log Files konfiguriert werden, damit sie in die Datenbank geschrieben werden?
|
| |
Frage:
Wie können wir Log Files konfigurieren, damit sie in die Datenbank geschrieben werden?
Antwort:
Der Job Scheduler übernimmt das automatisch,
wenn Sie eine Datenbankverbindung konfigurieren in ./config/factory.ini.
Der Job Scheduler erstellt Protokolle für Tasks und Aufträge. Sehen Sie sich bitte die
Erläuterungen zu Log Files an.
Hier sind einige Beispieleinstellungen im ./config/factory.ini:
; enable job history, if set to yes the
; scheduler keeps a job history in
; csv files or database tables
history = yes
; store job protocol for task history
; (yes|no|gzip, default: no)
history_with_log = gzip
; store job protocol for order history
; (yes|no|gzip, default: no)
order_history_with_log = gzip
; store protocol for scheduler history
; (yes|no|gzip, default: no)
history_archive = gzip
Dieses Beispiel konfiguriert, dass Protokolle in den blob columns der Datenbank
im gzip-Format gespeichert werden. Eine komplette Liste der Einstellungen erhalten Sie hier:
factory.ini.
Auf der Job Scheduler Web-Oberfläche können Sie sich die Job-Historie und den Inhalt der Protokolle anzeigen lassen.
Protokolle können von der Platte gelöscht werden und bleiben trotzdem in der Datenbank erhalten.
Wir liefern eine Reihe von Standard-Job aus und zwar für: Jobs für Logging und Cleanup
für das Rotieren von Logs, Entfernen von Debugging-Einträgen in der Datenbank und in den gzip-Protokollen
auf der Platte.
... weiterlesen
| | |