Skip navigation.
Suchen
Themen
Kompetenzen
Anmeldung

OPEN SOURCE - Job Scheduler - Lösungen

Job Scheduler
 
 
Job Scheduler - Frequently Asked Questions
 
Erste Schritte Trouble Shooting Datenbank Support Andere Fragen
 
 
 
 

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.

 

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


 

top of page
 
Warum wird ein Log File im GUI mit Verzögerung angezeigt?
 
Frage:
Wenn ich auf einen Menü-Button klicke und show log wähle, dann erscheint die GUI (Scheduler) gelegentlich leer, gerade so als gäbe es kein Log erst mit Verzögerung erscheint dann die GUI. Können Sie mir sagen wie es zu der Verzögerung kommt?

Antwort:
Prüfen Sie, ob die Anzahl der Prozessklassen in Ihrer scheduler.xml ausreichend ist (default 10), z.B.
        <process_classes>
            <process_class max_processes="20"/>
            <process_class name="many_processes" max_processes="30"/>
            ...
        </process_classes>
Ein Paket mit Standard Prozessen läuft in der default-Prozessklasse (das ohne das Attribut name=). Bei der Abwicklung von TCP-Aufträgen wird einer dieser Prozesse genutzt (dies wird durch den Einsatz des integrierten GUIs ausgelöst). Es ist möglich, dass weitere Prozesse (=jobs) in der default-Prozessklasse liefen und, dass das GUI darauf warten musste bis ein Prozess frei wurde.

 

top of page
 
Warum wird der Job Scheduler langsamer und verzögert die Ausführung von Jobs?
 
Frage:
Wenn mehrere Jobs im Job Scheduler ablaufen, wird das Programm langsamer und startet Jobs verzögert. Weshalb passiert das?

Antwort:
Prüfen Sie, ob die Einstellungen für den Mail Server richtig konfiguriert sind und ob der Mail Server verfügbar ist.

Per Voreinstellung werden eMails vom Hauptprozess des Job Schedulers versendet. Falls die Verfügbarkeit Ihres Mail Servers eingeschränkt ist und häufiger Verbindungsprobleme auftreten, kann dies den Hauptprozess verlangsamen, der wiederholt versucht den Mail Server zu kontaktieren und ggf. Timeouts der TCP-Verbindungen abwarten muss.

Konfigurieren Sie in diesem Fall den Job Scheduler für den asynchronen eMail-Versand durch einen Job: fügen Sie den Eintrag mail_queue_only=yes Ihrer Konfigurationsdatei ./config/factory.ini hinzu, um den Job Scheduler zu veranlassen, eMails in einem Verzeichnis abzulegen, dass mit der Einstellung mail_queue_dir bestimmt wird. Werden eMails asynchron von einem Job versendet, dann beeinflusst das nicht die Performanz des Job Schedulers im Fall von Verbindungsproblemen zum Mail Server.

Lesen Sie bitte bei den Lösungen mit Standard Jobs über Details zum Job scheduler_dequeue_mail.

 

top of page
 
Wann werden Änderungen an einer Job-Kette wirksam?
 
Frage:
In der Web-Oberfläche der Managed Jobs haben wir eine Job-Kette mit drei Jobs als ausführbare Dateien (Shell Scripte) implementiert. Wir haben dann die Befehlsdatei und den Namen des Jobs in der Job-Kette geändert und danach gespeichert. Das Problem ist, dass die Änderungen nicht dynamisch ausgeführt wurden, sondern erst nach dem Neustart des Job Schedulers. Ist dieses Verhalten vorgesehen?

Antwort:
Aktualisieren von Jobs und Job-Ketten:
  1. Wenn Sie den Inhalt eines Jobs verändern, z.B. den Inhalt der Befehlsdatei, die Laufzeitkonfiguration oder die Konfiguration der Parameter, dann werden die Änderung sofort vom Job Scheduler akzeptiert.

  2. Ändern Sie den Namen eines Jobs (oder den Input/Output/Error Level), dann ist diese Änderung nicht nur für einen Job gültig, sondern für die gesamte Job-Kette. In diesem Fall können Ihre Änderungen nicht sofort übergeben werden, weil sonst das folgende Verhalten eintritt:
    • Aufträge in der Warteschlange für den Start benötigen die vorgegebene Struktur der Job-Verknüpfungen in der Job-Kette und den Status des ersten Job-Knotens.
    • Aufträge, die sich in Verarbeitung befinden, müssen auf die vorgegebene Struktur der Verknüpfungen in der Job-Kette zugreifen können, weil sonst veränderte Input/Output/Error Levels dazu führen, dass es keinen entsprechenden Endstatus zu einer Job-Verknüpfung gibt.

    Ein derartiger Auftrag kann nicht erfolgreich beendet werden, was auf das Transaktionsverhalten der Web-Oberfläche zurückgeht, die einen Job nach dem anderen speichern muss und nicht all gleichzeitig speichern kann.

    Über die Web-Oberfläche der "Managed Jobs" wird in diesen Fällen asynchron ein Job gestartet, der die Job-Kette entfernt und neu einrichtet. Dieser Job berücksichtigt evtl. laufende Aufträge, es kann daher zur kurzern Verzögerungen kommen bis die Änderung an der Job-Kette wirksam wird.


 

top of page
 
Können Jobs und Aufträge in mehreren Job Scheduler Instanzen ausgeführt werden?
 
Frage:
Kann ein Job einen Folge-Job in einer anderen Job Scheduler Instanz auslösen? Gilt das auch für Aufträge einer Job-Kette, die in einer Job-Kette einer anderen Instanz fortgesetzt werden?

Antwort:
Jobs und Aufträge in anderen Job Scheduler Instanzen:
  1. Sie können ab Release 1.2.9 den Standard-Job scheduler_remote_execution der Auslieferung verwenden, um Jobs und Aufträge in anderen Job Scheduler Instanzen auszulösen, siehe Lösungen mit Standard-Jobs.

    Der Job kann bspw. eingesetzt werden, um als Folge-Job eine nachfolgende Verarbeitung in einer anderen Job Scheduler Instanz zu aktivieren. Dabei können zu startende Jobs, Aufträge und beliebige XML Kommandos übergeben werden.

  2. Aktuell stehen Ihnen zwei Möglichkeiten zur Verfügung, das Auslösen von Jobs und Aufträgen in anderen Instanzen und das Verteilen mehrerer gleichartiger Konfigurationen für Jobs und Job-Ketten in unterschiedlichen Instanzen:
    • Der o.g. Job scheduler_remote_execution kann auftragsgesteuert in einer Job-Kette verwendet werden, um einen Verarbeitungsschritt in einer anderen Job Scheduler Instanz auszuführen. Dabei wird aktuell nicht das Ende der Verarbeitung in der Job-Kette der anderen Instanz abgewartet, sondern die erfolgreiche Auslösung quittiert und die Verarbeitung in der lokalen Job-Kette fortgesetzt.

      Um Ergebnisse (payload) von Aufträgen aus einer anderen Instanz in die lokale Instanz zu übertragen, müssen Sie in der anderen Instanz denselben Job scheduler_remote_execution konfigurieren und den Auftrag an die lokale Instanz zurückgeben.

    • Um gleichartige Konfigurationen für Jobs und Job-Ketten auf mehreren Rechnern zu betreiben, können Sie die Installations-Komponente Managed Jobs verwenden. Dabei werden Konfigurationen in einer zentralen Datenbank vorgehalten und beim Start der jeweiligen Job Scheduler Instanz automatisch übernommen, siehe Dokumentation Managed Jobs.

    Dieser Punkt wird im Rahmen der Roadmap erweitert werden.


 

top of page
 
Was ist der Unterschied zwischen Verzeichnisüberwachung und Dateiaufträgen?
 
Frage:
Die Referenzdokumentation enthält zwei Kapitel zur "Verzeichnisüberwachung" und "Verzeichnisüberwachung mit Dateiaufträgen". Worin unterscheiden sich diese features?

Antwort:
Verzeichnisüberwachung:
wird verwendet, um Jobs automatisch bei einem Datei-Event in einem Verzeichnis zu starten. Sie können entweder ein Verzeichnis überwachen, um einen Job zu starten, oder jeweils einen Auftrag pro Datei vom Job Scheduler erzeugen lassen.

  1. Verzeichnisüberwachung für Job-Starts

    Sie können beliebige Jobs automatisch starten lassen sobald Änderungen in einem oder mehreren Verzeichnissen erfolgen, indem Sie das <start_when_directory_changed> Element Ihrer Job-Konfiguration hinzufügen. Der Job Scheduler startet den Job, wenn ein entsprechendes Ereignis für eine Datei eintritt, die einem angebbaren regulären Ausdruck entspricht.

    Ihre Job Implementierung muss allerdings berücksichtigen, dass mehrere Dateien gleichzeitig eintreffen können. Der Job Scheduler übergibt die Dateienamen an den Job mittels der Umgebungsvariablen SCHEDULER_TASK_TRIGGER_FILES bzw. der API Methode spooler_task.trigger_files(). Mehrere Dateinamen sind durch ";" getrennt. Außerdem sollte Ihr Job ggf. Dateinamen verarbeiten können, die Leerzeichen enthalten, siehe untenstehende Beispiele für Implementierungen mit der Shell.

    Darüber hinaus ist es Aufgabe Ihrer Job-Implementierung Dateien aus dem überwachten Verzeichnis zu verschieben bzw. zu löschen und ggf. Fehler zu behandeln. Es kann für diese Aufgaben angemessener sein, Dateiaufträge einzusetzen.

    Beispiel:
    
    <job name="my_job">
      <!-- for unix shell -->
      <script language = "shell"><![CDATA[
        IFS=";"
        for trigger_file in ${SCHEDULER_TASK_TRIGGER_FILES}
        do
          echo $trigger_file
          mv "$trigger_file" /tmp/output
        done
        IFS=$' \t\n' 
        exit 0
      ]]</script>
    
      <!-- for windows shell -->
      <--
      <script language = "shell"><![CDATA[
        @echo off
        if not defined SCHEDULER_TASK_TRIGGER_FILES exit 0
        set trigger_files=%SCHEDULER_TASK_TRIGGER_FILES:;=?%
        :loop
        for /F "usebackq tokens=1* delims=?" %%i in ('%trigger_files%') do (
          set trigger_files=%%j
          @echo %%~fi
          move /y "%%~fi" \tmp\output
          goto loop
        )
        exit 0
      ]]></script>
      -->
    
      <start_when_directory_changed directory="/tmp" regex="sos.*"/>
    </job>
                      
  2. Verzeichnisüberwachung mit Dateiaufträgen

    Ab Release 1.2.9 können Sie automatisch Aufträge für einzelne Dateien erzeugen lassen, die in einem oder mehreren überwachten Verzeichnissen erscheinen. Fügen Sie dazu ein oder mehrere <file_order_source/> Elemente als erste Job-Knoten Ihrer Job-Kette hinzu. Zum Konzept der Aufträge siehe Was ist das Konzept der Job-Ketten und der Auftragsverarbeitung?

    Für jedes Verzeichnis, das von einem <file_order_source> Element überwacht ist, wird automatisch ein Auftrag generiert, wenn eine Datei dem angebbaren regulären Ausdruck entspricht. Sie müssen keine konkurriernden Zugriffe berücksichtigen: ein Auftrag wird pro Datei einmal erzeugt und der Dateiname wird im Auftragsparameter order.params().value("scheduler_file_path") geliefert. Nachdem die Datei von Ihren Jobs verarbeitet wurde, wird sie von einem <file_order_sink> Element am Ende der Job-Kette verschoben bzw. entfernt. Wird die Datei manuell entfernt, dann entfernt der Job Scheduler den Auftrag automatisch, falls er noch nicht angelaufen ist.

    Da Aufträge persistent in der Job Scheduler Datenbank gespeichert werden können, kann die Verarbeitung nach dem Neustart des Job Schedulers fortgesetzt werden. Das gleiche gilt im Fall von Fehlern während der Verarbeitung in Job-Knoten: der Auftrag kann im jeweiligen Job-Knoten nach einer konfigurierbaren Verzögerung zurückgestellt oder wiederholt werden.

    Beispiel:
    
    <job_chain  name = "inbound_files">
      <file_order_source  directory = "/tmp/inbound"      regex = "[^~]$"          
                             delay_after_error = "5"/>
      <file_order_source  directory = "/tmp/inbound.add"  regex = "[^~]$"          
                             delay_after_error = "5"/>
      <job_chain_node         state = "convert"           next_state = "transfer"  
                                 error_state = "error"
                                job = "file_convert"/>
      <job_chain_node         state = "transfer"          next_state = "success"   
                                 error_state = "error"/>
                                job = "file_transfer"/>  
      <file_order_sink      move_to = "/tmp/inbound.success"  state = "success"/>
      <file_order_sink      move_to = "/tmp/inbound.error"    state = "error"/>
    </job_chain>
                      
Weitere Details finden Sie in der Referenzdokumentation zu Verzeichnisüberwachung mit Dateiaufträgen.

 

top of page
 
Können doppelte Anführungszeichen in Job- oder Auftragsparametern enthalten sein?
 
Frage:
Können doppelte Anführungszeichen in Job- oder Auftragsparametern enthalten sein?

Antwort:
Doppelte oder einfache Anführungszeichen werden als Begrenzer für XML Attributwerte verwendet, daher können einfache Anführungszeichen innerhalb eines mit doppelten Anführungszeichen begrenzten Attributwerts vorhanden sein und umgekehrt. Wenn allerdings doppelte und einfache Anführungszeichen gemeinsam in einem Attributwert vorhanden sein sollen, dann sollten Sie die XML Entities &quot; und &apos; verwenden, die entsprechend substitutiert werden:

  • <process file"... cmd.exe" param="/c echo 'hello world' "/>
  • <process file"... cmd.exe" param='/c echo "hello world" '/>
  • <process file"... cmd.exe" param="/c echo &quot;hello&quot; &apos;world&apos; "/>

 

top of page
 
Wie kann man einen einzelnen Job manuell starten, der Knoten einer Job-Kette ist?
 
Frage:
Wie kann man einen einzelnen Job manuell starten, der Knoten einer Job-Kette ist?

Antwort:
Die kurze Antwort lautet: bitte kopieren Sie den Job unter einem anderen Namen und lassen Sie das Attribut order="yes" weg. Um die Job-Implementierung nicht mehrfach eingeben zu müssen, können Sie sie in mehreren Jobs einfügen:

<job name="job_1">
  <script language="shell">
    <include file="my_shell_commands.cmd"/>
  </script>
</job>
              
Der Grund für dieses Verhalten ist, dass Sie beliebige Jobs einzeln starten können, wenn sie nicht Teil einer Job-Kette sind (Attribut order="no". Die HTML-Oberfläche bietet eine entsprechende Funktion für Job-Starts. Ist der Job dagegen Teil einer Job-Kette, dann ist normalerweise gewünscht, dass die komplette Job-Kette durchlaufen wird, nicht ein einzelner Job-Knoten.

Darüber hinaus gibt es einige Unterschiede zwischen standalone Jobs und Jobs in einer Job-Kette, weshalb Sie eher selten dieselbe Implementierung benutzen würden. Die Unterschiede bestehen vor allem in der Verwendung des APIs für Jobs:

  • Zusätzlich zu Job-Parameteren, die nur für den betreffenden Job sichtbar sind, können Aufträge Parameter enthalten, die für alle Jobs der Job-Kette sichtbar sind.

  • Der return code von Jobs mit API-Implementierung verwendet true in der Methode spooler_process(), um eine wiederholte Verarbeitung des Jobs zu veranlassen, während auftragsgesteuerte Jobs die erfolgreiche Verarbeitung eines Job-Knotens mit true und Fehler mit false signalisieren.


Die Standard-Jobs und Beispiele für API-Jobs, die Sie im Bereich Lösungen der Job Scheduler web site finden, unterstützen beide Betriebsweisen für Aufträge und für standalone Jobs.

 

top of page
 
Wie kann der Job Scheduler ein Programm ausführen, das ein GUI anzeigt?
 
Frage:
Welchen Grund kann es geben, weshalb ein Windows GUI Programm an der Kommandozeile korrekt ausgeführt wird, im Job Scheduler dagegen nicht? Der Job Scheduler startet das Programm und ich kann es im Task Manager sehen, kurze Zeit später ist es beendet und es wird kein Fehler gemeldet.

Antwort:
Es gibt (mindestens) zwei Erklärungen für dieses Verhalten:

  • Das Programm liefert keinen passenden Exit Code im Fall von Fehlern oder Warnungen; passend bezeichnet einen Exit Code != 0. Daher kann der Job Scheduler keinen Fehler bemerken. Darüber hinaus würden Fehler bemerkt, falls das Programm Meldungen nach stderr schreibt.

  • Sie sagen, das Programm zeigt normalerweise ein GUI - das kann Probleme verursachen: der Job Scheduler führt Programme im Batch aus, d.h. ohne Benutzerinteraktion, da es keinen Benutzer gibt, der auf Eingabeaufforderungen antworten könnte.

    Um das zu verifizieren, können Sie den Job Scheduler manuell starten: stoppen Sie den Job Scheduler als Dienst und starten Sie ihn in einer DOS-Box an der Kommandozeile mit .\bin\jobscheduler.cmd start

    Sollte das Programm sich jetzt korrekt verhalten, dann können Sie die Einstellungen in der Windows Dienstesteuerung für den Job Scheduler anpassen: im Dienstefenster gibt es den Karteireiter Anmelden, in dem normalerweise das lokale Systemkonto zugewiesen ist. Hier finden Sie eine Check-Box, die vereinbart, dass der Datenaustausch zwischen Dienst und Desktop zugelassen ist.

 

top of page
 
Kann Job Scheduler für 32bit und für 64bit Plattformen eingesetzt werden?
 
Frage:
Ich versuche Job Scheduler unter Linux 64bit zu betreiben und erhalte die Fehlermeldung "ERROR Z-JAVA-100 Java Virtual Machine cannot be loaded". Kann Job Scheduler für 32bit und für 64bit Plattformen eingesetzt werden?

Antwort:
Ja, Sie können den Job Scheduler auf den unterstützten Betriebssystemen mit 64bit Betrieb einsetzen. Bitte, beachten Sie die folgenden Hinweise und Voraussetzungen:

  • Job Scheduler ist ein 32bit Programm

    Der Job Scheduler ist als 32bit Programm entwickelt worden. Sie könnten jetzt fragen, weshalb die Software nicht für 64bit portiert wird? Die Anwort ist einfach: es gibt keinen Bedarf für diese Portierung.

    • Sie können die ausführbare 32bit Datei des Job Schedulers auf jeder der unterstützten 64bit Plattformen ablaufen lassen (Windows, Linux, Solaris, HP-UX PA-RISC, HP-UX Itanium). Der Betrieb des Job Schedulers erfolgt unabhängig von der Tatsache, dass Sie vermutlich 64bit Programme innerhalb Ihrer Job-Implementierungen ablaufen lassen wollen, da der Job Scheduler plattformspezifische Prozesse startet.

    • Der mögliche Gewinn an Ausführungsgeschwindigkeit zwischen einer 32bit Version und einer 64bit Version des Job Schedulers ist vernachlässigbar. Der bei weitem höhere Anteil der Ausführungszeit wird durch Jobs verbraucht, nicht durch den Job Scheduler.

    • Für eine 64bit Version des Job Schedulers ist ein forking des Codes erforderlich. Aktuell stellen die 32bit Plattformen (Windows) den größten Anteil der Downloads dar und müssen weiter unterstützt werden. Wir würden daher zusätzliche Entwicklerkapazitäten für die Pflege zweier Versionen über einen längeren Zeitraum aufwenden müssen, was effektiv die Roadmap des Job Schedulers verlangsamen würde. Wir schätzen den Nutzen neuer Features höher ein als den Nutzen aus einer vereinfachten Installation durch einen nativen 64bit Job Scheduler.

  • Java 32bit JRE

    Ein Java 32bit JRE wird für die Ausführung des Setups und für den Betrieb des Job Schedulers benötigt.

    Unserer Erfahrung nach ist es keine schlechte Idee ein von SUN bereitgestelltes JRE zu verwenden, da JREs anderer Distributionen, z.B. IBM Websphere, in manchen Punkten weniger vollständig bzw. für das jeweilige Produkt in einer Weise abgeändert sind, die keine ausreichende Kompatibilität mit Java Standards gewährleistet.

    • Windows 64bit

      Sie können das im entsprechenden Job Scheduler Download enthaltene JRE 1.5 verwenden oder ein separates 32bit JRE installieren. Sie sollten das neu installierte JRE auf keinen Fall permanent in Ihre PATH Systemvariable aufnehmen (oder eine ggf. vorhandene JDK JAVA_HOME Systemvariable ändern), da dies das Verhalten anderer Programme beeinflussen würde, die auf den Betrieb mit einem 64bit JRE angewiesen sind. Die Installation können Sie in folgenden Schritten vornehmen:

      1. Führen Sie Download und Installation des 32bit JRE durch.
      2. Öffnen Sie ein Konsolenfenster und fügen Sie den Pfad des gerade installierten JRE Ihrer PATH Variablen hinzu, z.B.:
        C:\>SET PATH=C:\Program Files (x86)\Java\jre1.5.0_01\bin;%PATH%
      3. Entpacken Sie das Archiv des Job Scheduler Downloads in ein temporäres Verzeichnis, z.B. C:\temp\scheduler.
      4. Starten Sie im Konsolenfenster Java mit dem Job Scheduler Setup aus dem temporären Verzeichnis, z.B.:
        C:\>java -jar C:\temp\scheduler\scheduler_win32.jar
      5. Nach Abschluss des Setups fügen Sie bitte den Pfad der Java Virtual Machine Ihrer Job Scheduler Konfigurationsdatei .\config\sos.ini hinzu, z.B.:
        [java]
        vm = C:/Program Files (x86)/Java/jre1.5.0_01/bin/client/jvm.dll

    • Unix/Linux 64bit

      Sie müssen ein 32bit JRE per Download beziehen, falls keines auf dem Rechner verfügbar ist.

      1. Führen Sie Download und Installation des 32bit JRE durch.
      2. Fügen Sie den Pfad des gerade installierten JRE Ihrer PATH Variablen hinzu, z.B.:
        PATH=$HOME/jdk1.5.0_06/jre/bin:$PATH
      3. Entpacken Sie das Archiv des Job Scheduler Downloads in ein temporäres Verzeichnis, z.B. /tmp/scheduler. md /tmp/scheduler
        cd /tmp/scheduler
        tar xzf scheduler_linux.1.3.1.tar.gz
        .
      4. Starten Sie Java mit dem Job Scheduler Setup aus dem temporären Verzeichnis, z.B.:
        java -jar /tmp/scheduler/scheduler_linux32.jar
      5. Nach Abschluss des Setups fügen Sie bitte den Pfad der Java Virtual Machine der Umgebungsvariable LD_LIBRARY_PATH im Startup Script ./bin/jobscheduler.sh hinzu, z.B.:
        LD_LIBRARY_PATH=$SCHEDULER_HOME/lib:/usr/local/lib:
        $HOME/jdk1.5.0_06/jre/lib/i386:
        $HOME/jdk1.5.0_06/jre/lib/i386/client:
        $LD_LIBRARY_PATH


  • Job Scheduler Setup für 64bit Plattform

    Stellen Sie bitte sicher, dass bei Ausführung des Job Scheduler Setups ein 32bit JRE verwendet wird. In Abhängigkeit von der Zielplattform kann es Unterschiede in der Installation des Job Schedulers geben:

    • Windows 64bit

      Wie jedes andere 32bit Programm müssen Sie den Job Scheduler und das Java JRE im Verzeichnis C:\Program Files (x86) (bzw. dem sprachspezifischen Verzeichnisnamen) für 32bit Programme installieren. Eine Installation in andere Verzeichnisse wird nicht funktionieren.

      Falls dieses Verzeichnis nicht der ideale Aufbewahrungsort für Ihre Job Scheduler Konfigurations- und Protokolldateien ist, dann können Sie die Pfade für diese Dateein im Script .\bin\jobscheduler.cmd anpassen, indem Sie die entsprechenden Kommandozeilenoptionen ändern (-config, -log-dir, -log etc.). Damit die Änderungen für den Betrieb des Job Schedulers als Windows-Dienst wirksam werden, sollten Sie die folgenden Kommandos verwenden (das Beispiel verwendet C:\Program Files (x86)\scheduler als Installationsverzeichnis):

      C:\>cd "C:\Program Files (x86)\scheduler\bin"
      C:\Program Files (x86)\scheduler\bin>jobscheduler.cmd remove
      C:\Program Files (x86)\scheduler\bin>jobscheduler.cmd install


    • Unix/Linux 64bit

      Es gibt keinen Unterschied bzgl. der Installation des 32bit Job Schedulers für diese Plattform. Allerdings müssen Sie ggf. Änderungen am Startup Script bzgl. des JRE Installationsverzeichnisses vornehmen (siehe oben).


 

top of page

top of page
 
Zugriff auf Netzwerklaufwerke (Windows)
 
Frage:
Von einem Job Scheduler Job versuche ich auf ein Netzwerklaufwerk (z.B. X) zuzugreifen. Zwar kann auf das Laufwerk von außerhalb des Job Schedulers zugegriffen werden, aber innerhalb des Jobs existiert es nicht.

Antwort:
Dieses Verhalten ist eher ein Windows Feature als ein Bug im Job Scheduler. Auf Windows läuft der Job Scheduler als Service und Services werden von einem Prozess gestartet und zwar zu dem Zeitpunkt wenn das Betriebssystem gestartet wird. Dies wiederum passiert zu einem viel früheren Zeitpunkt als der Start des Laufwerks, das mit dem Logon des Nutzers geschieht.

Um vom Job Scheduler aus auf das Laufwerk zuzugreifen, muss es im Job Scheduler Prozess eingebunden sein. Die kann im Startup-Skipt des Job Schedulers erfolgen. Im Detail ist folgendes zu tun:

  • Stellen Sie sicher, dass der Job Scheduler so eingestellt ist, dass er die Erlaubnis zum Zugriff auf Netzwerklaufwerk(e) hat (Prüfen Sie die Services Konfiguration um einen unterschiedlichen Nutzer einzustellen).

  • Konfigurieren Sie einen Scheduler Start Skript um das Netzwerklaufwerk einzubinden:
    <scheduler_script name = "mount_drives">
    <script language="VBScript">
    <![CDATA[
    Function spooler_init
    Dim ws, return_code, command
    
    *command = "net.exe use X: **\\server\dir* <file://%5C%5Cserver%5Cdir>*"
    *Set ws = CreateObject("Wscript.shell")
    return_code = ws.run( command, 0, 1 )
    Set ws = Nothing
    
    If return_code > 0 Then spooler_log.warn("Failed to mount drives: " & return_code)
    spooler_init = true
    End Function
    ]]>
    </script>
    
    </scheduler_script>                              
    
  • Legen Sie das <script> Element in config/scheduler.xml zwischen die <process_classes> und <http_server> Elemente.

  • Starten Sie den Job Scheduler neu.

 
 
  Job Scheduler mit Windows 2008 betreiben
  Question:
Kann ich den Job Scheduler mit Windows 2008 beteiben?

Answer:
Ja, Job Scheduler kann auf Windows 2008 betrieben werden.
 
  Funktionieren Web Services und das GUI des Job Scheduler mit IIS?
  Frage:
Ich gehe davon aus, dass die Web Services und das GUI des Job Scheduler mit IIS funktionieren, stimmt das?

Antwort:
Der Job Scheduler verfügt über zwei web-basierte GUIs:
  • Operations GUI
    Um das operations GUI zu betreiben ist kein Web Server notwendig, da der Job Scheduler über einen eigenen eingebauten Web-Server verfügt.

  • Managed Jobs GUI
    Um das Mangaged Jobs interface to betreiben, benötigen Sie zumindest Apache oder IIS. Außerdem benötigt das Managed Jobs interface zusätzlich PHP. Lesen Sie mehr darüber in der Dokumentation, im Kapitel 6.5:
    Job Scheduler: Installation und Konfiguration

  • IIS kann als Web Server genutzt werden, umd IIS/PHP zu konfigurieren, müssen Sie die Documentation von IIS und PHP nutzen.
 
 
  ™ MySQL is a registered trademark of MySQL AB
™ Oracle is a registered trademark of The Oracle Corp.

    Seitenanfang

 
 
  Office Automation - Document Delivery - Job Scheduling - Systems Integration - Output Management - Enterprise Application Integration - Connectivity