OPEN SOURCE - Job Scheduler - Lösungen

Job Scheduler
 
 

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.)

 

 
 
Job Scheduler - Frequently Asked Questions
 
Erste Schritte Trouble Shooting Datenbank Support Lizenz und Support Andere Fragen
 
 
 
 
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.

 

top of page
 
Job-Abhängigkeiten herstellen
 
Frage:
Welche Job-Abhängigkeiten können mit dem Job Scheduler verwaltet werden?

Antwort:
  1. 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.

  2. 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)



 

top of page
 
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.


 

top of page
 
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.

 

top of page
 
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> 
              
 

top of page
 
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.

 

top of page
 
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.

 

top of page
 
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.

 

top of page
 
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>
 

top of page
 
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.

 

top of page
 
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=...>).

 

top of page
 
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.

 

top of page
 
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.

 

top of page
 
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

 

top of page
 
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).

 

top of page
 
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.

 

top of page
 
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:

  • Jobs auf demselben Rechner: setuid

    In der Auslieferung ist das Programm setuid enthalten, das das Umschalten der Benutzerkennung für einen Job ermöglicht ohne dass in der Job Scheduler Konfiguration ein Kennwort hinterlegt werden müsste. Dazu wird das Programm ./bin/setuid mit den Rechten der Zielkennung, z.B. "nobody" kopiert:

    cd ~/scheduler/bin
    mkdir nobody
    chmod go-rwx nobody
    cp setuid nobody/setuid-nobody
    chown nobody nobody/setuid-nobody (has to be done by root)
    chmod u+s,a-r nobody/setuid-nobody (has to be done by root)


    Das Beispiel geht davon aus, dass der Job Scheduler in der Kennung "test" betrieben wird und Jobs in der Kennung "nobody" ausführen soll: mit der obigen Kommandofolge erzeugen Sie ein schreibgeschütztes Verzeichnis mit einer Kopie von setuid für die Kennung "nobody"; die Datei setuid-nobody ist für die Kennung "test" ausführbar", gehört aber dem Benutzer "nobody". Mit dem Programm setuid-nobody lassen sich beliebige Kommandos in der Kennung "nobody" ausführen ohne dass ein Kennwort für die Zielkennung angegeben werden muss. setuid-nobody prüft, ob die o.g. Rechte gesetzt sind und bricht andernfalls ab.

    Die Konfiguration eines Jobs in der Konfigurationsdatei scheduler.xml, der in der Zielkennung ausgeführt wird, lautet dann etwa so:
    
    <job name = "sample_setuid_job">
      <process file  = "$SCHEDULER_HOME/bin/nobody/setuid-nobody"
               param = "/home/test/scheduler/jobs/sample_script_notification.pl"/>
    </job>
    
  • Jobs auf demselben oder anderen Rechnern: ssh

    Um ausführbare Dateien mit ssh zu verarbeiten, müssen Sie folgendes einrichten:
    • shh client und ssh server installieren
    • ein Schlüsselpaar bestehend aus privatem und öffentlichem Schlüssel auf dem Client-Rechner erzeugen; den öffentlichen Schlüssel publizieren Sie im Verzeichnis .ssh des Zielrechners.
    • Jobs mit der Konfiguration <process file="ssh" params="..."/> einrichten: die Kommandozeilenparameter geben Sie im Attribut param= an.


    ssh kann zum Ausführen von Kommandos auf dem lokalen oder anderen Rechnern verwendet werden. Alternativ kann eine weitere Instanz des Job Schedulers auf dem anderen Rechner installiert werden, falls Sie über keinen ssh Server verfügen und den Aufwand einer Public Key Infrastruktur vermeiden wollen.

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.

 

top of page
 
Ü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.

 

top of page
 
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).

 

top of page
 
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.

 

top of page
 
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.

 

top of page
 
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.

 

top of page
 
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.

 

top of page
 
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.

 

top of page
 
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.

 

top of page
 
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.

 

top of page
 
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.

 

top of page
 
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.

 

top of page
 
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:

  1. das dezentrale Server-Betriebssystem nicht vom Job Scheduler unterstützt wird?

  2. 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:
  1. 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.

  2. 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.

  3. 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.

 

top of page
 
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.

 

top of page
 
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.

 

top of page
 
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.

 

top of page
 
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.


 

top of page
 
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>              
 

top of page
 
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

 

top of page
 
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